使用随机指针C ++复制列表

时间:2014-02-04 04:28:00

标签: c++

我正在尝试使用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

2 个答案:

答案 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;

}
};