【发布时间】:2017-02-27 10:58:56
【问题描述】:
我正在用 C++ 在 LeetCode 上编写一个小代码 sn-p。问题是:
给定一个链表,使得每个节点都包含一个额外的随机指针,该指针可以指向列表中的任何节点或为空。 返回列表的深层副本。
我的方法是获取一个哈希图并用节点指针作为键和随机指针作为值填充它。然后进行两次迭代,一次复制仅包含 next 指针的 LinkedList,第二次复制随机指针。
我编写了以下代码 sn-p 但它抛出了一个奇怪的编译错误。
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
std::map<RandomListNode*, RandomListNode*> m;
RandomListNode *curr = head;
while(curr!=NULL){
m.insert(curr, curr->random);
curr = curr->next;
}
curr = head;
RandomListNode *newHead = NULL;
RandomListNode *curr2 = NULL;
while(curr!=NULL){
if(newHead == NULL){
newHead = new RandomListNode(curr->label);
newHead->next = NULL;
curr2 = newHead;
}
else{
RandomListNode *tempNode = new RandomListNode(curr->label);
tempNode->next = NULL;
curr2->next = tempNode;
curr2 = curr2->next;
}
curr = curr->next;
}
curr2 = newHead;
while(curr2!=NULL){
std::map<RandomListNode*, RandomListNode*>::const_iterator pos = m.find(curr2);
curr2->random = pos->second;
curr2 = curr2->next;
}
return newHead;
}
};
并且代码抛出以下错误:
required from 'void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(_II, _II) [with _InputIterator = RandomListNode*; _Key = RandomListNode*; _Val = std::pair<RandomListNode* const, RandomListNode*>; _KeyOfValue = std::_Select1st<std::pair<RandomListNode* const, RandomListNode*> >; _Compare = std::less<RandomListNode*>; _Alloc = std::allocator<std::pair<RandomListNode* const, RandomListNode*> >]'
有人可以帮我确定我哪里出错了吗? 谢谢!
【问题讨论】:
-
这只是错误消息的一部分。
-
这是 LeetCode 唯一提供的东西:/
-
您需要稍微不同的方法。您的地图包含原始列表中的节点,因此 1)您不会在地图中找到
curr2,并且 2)您可以找到的“随机”节点都是原始列表的所有元素,而不是副本。地图的想法是正确的,但你需要一个不同的映射。 (把它算出来作为练习。) -
是的,这就是问题所在。不过谢谢! :)
标签: c++ dictionary stl hashmap