我正在尝试使用leetcode在C ++中解决这个面试问题,这是我的代码,我编写自己的测试用例来验证解决方案:
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
struct RandomListNode {
int label;
RandomListNode *next, *random;
RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};
RandomListNode *copyRandomList(RandomListNode *head);
void printList(RandomListNode* head);
int main()
{
RandomListNode* list1=new RandomListNode(1);
RandomListNode* list2=new RandomListNode(2);
RandomListNode* list3=new RandomListNode(3);
RandomListNode* list4=new RandomListNode(4);
RandomListNode* list5=new RandomListNode(5);
list1->next=list2;
list2->next=list3;
list3->next=list4;
list4->next=list5;
list1->random=list3;
list3->random=list5;
list2->random=list1;
list4->random=list3;
RandomListNode *copied=copyRandomList(list1);
printList(list1);
cout<<endl;
system("PAUSE");
return 0;
}
void printList(RandomListNode* head)
{
while(head!=NULL)
{
cout<<head->label<<" "<<head->random->label<<endl;
head=head->next;
}
}
RandomListNode *copyRandomList(RandomListNode *head)
{
RandomListNode *p=head;
p=p->next;
RandomListNode *q=new RandomListNode(p->label);
RandomListNode *q1=q;
unordered_map<RandomListNode*, RandomListNode*> hashMap;
hashMap.insert(make_pair(head, q));
// deep copy the list with all the next pointers
while(p!=NULL)
{
RandomListNode *tmp=new RandomListNode(p->label);
q->next=tmp;
q=q->next;
hashMap.insert(p,q);
p=p->next;
}
p=head;
q=q1;
// deep copy the random pointers
while(p!=NULL)
{
if(p->random!=NULL)
q->random=hashMap[p->random];
p=p->next;
q=q->next;
}
q=q1;
}
然而,当我尝试编译时,有一个错误说:
错误1错误C2664:'std :: pair&lt; _Ty1,_Ty2&gt; std :: _ Hash&lt; _Traits&gt; :: insert(std :: pair&amp;&amp;)':无法将参数1从'RandomListNode'转换为'std :: pair&lt; _Ty1,_Ty2&gt; &安培;&安培;” c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xhash 684
答案 0 :(得分:3)
insert
只接受一个参数,一个键值对,而不是键和值的两个独立参数。所以
hashMap.insert(p,q);
应该是
hashMap.insert(make_pair(p, q));
就像你之前做过几行一样。
答案 1 :(得分:0)
这是我今天为LeetCode写的相同问题的代码,花了108ms,我在1遍中解决了解决方案,没有使用额外的数据结构。
/**
* 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) {
RandomListNode* cur=NULL;
RandomListNode* nhead=NULL;
if(!head)
return NULL;
cur=new RandomListNode(head->label);
nhead=cur;
while(head){
if(head->next)
cur->next=new RandomListNode(head->next->label);
if(head->random){
if(head->random==head->next)
cur->random=cur->next;
else
cur->random=new RandomListNode(head->random->label);
}
head=head->next;
cur=cur->next;
}
return nhead;
}
};