next=list2; list2->next=list3; list3->next=list4; list4->next=list5; list1->random=list3; list3->random=list5; list2->random=list1; list4->random=list3; 随机列表节点*复制=复制随机列表(列表1); 打印列表(列表1); coutnext; } p=水头; q=q1; //深度复制随机指针 while(p!=NULL) { 如果(p->random!=NULL) q->random=hashMap[p->random]; p=p->next; q=q->next; } q=q1; },c++,C++" /> next=list2; list2->next=list3; list3->next=list4; list4->next=list5; list1->random=list3; list3->random=list5; list2->random=list1; list4->random=list3; 随机列表节点*复制=复制随机列表(列表1); 打印列表(列表1); coutnext; } p=水头; q=q1; //深度复制随机指针 while(p!=NULL) { 如果(p->random!=NULL) q->random=hashMap[p->random]; p=p->next; q=q->next; } q=q1; },c++,C++" />

使用随机指针C+复制列表+; 我试图解决C++中的LeTeCK中的面试问题,这里是我的代码,我编写自己的测试用例来验证解决方案: #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; } #包括 #包括 #包括 使用名称空间std; 结构随机列表节点{ int标签; RandomListNode*下一步,*随机; RandomListNode(intx):标签(x)、下一个(NULL)、随机(NULL){} }; RandomListNode*copyRandomList(RandomListNode*head); 作废打印列表(随机列表节点*头); int main() { RandomListNode*list1=新的RandomListNode(1); RandomListNode*list2=新的RandomListNode(2); RandomListNode*list3=新的RandomListNode(3); RandomListNode*list4=新的RandomListNode(4); RandomListNode*list5=新的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; 随机列表节点*复制=复制随机列表(列表1); 打印列表(列表1); coutnext; } p=水头; q=q1; //深度复制随机指针 while(p!=NULL) { 如果(p->random!=NULL) q->random=hashMap[p->random]; p=p->next; q=q->next; } q=q1; }

使用随机指针C+复制列表+; 我试图解决C++中的LeTeCK中的面试问题,这里是我的代码,我编写自己的测试用例来验证解决方案: #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; } #包括 #包括 #包括 使用名称空间std; 结构随机列表节点{ int标签; RandomListNode*下一步,*随机; RandomListNode(intx):标签(x)、下一个(NULL)、随机(NULL){} }; RandomListNode*copyRandomList(RandomListNode*head); 作废打印列表(随机列表节点*头); int main() { RandomListNode*list1=新的RandomListNode(1); RandomListNode*list2=新的RandomListNode(2); RandomListNode*list3=新的RandomListNode(3); RandomListNode*list4=新的RandomListNode(4); RandomListNode*list5=新的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; 随机列表节点*复制=复制随机列表(列表1); 打印列表(列表1); coutnext; } p=水头; q=q1; //深度复制随机指针 while(p!=NULL) { 如果(p->random!=NULL) q->random=hashMap[p->random]; p=p->next; q=q->next; } q=q1; },c++,C++,但是,当我尝试编译时,出现了一个错误: 错误1错误C2664:'std::pair std::_Hash::insert(std::pair&)':无法将参数1从'RandomListNode'转换为'std::pair&'c:\program files(x86)\microsoft visual studio 11.0\vc\include\xhash 684 insert接受单个参数,即键-值对,而不是键和值的两个独立参数。所以 hashMap.insert(p,q); 应该是 hash

但是,当我尝试编译时,出现了一个错误:

错误1错误C2664:'std::pair std::_Hash::insert(std::pair&)':无法将参数1从'RandomListNode'转换为'std::pair&'c:\program files(x86)\microsoft visual studio 11.0\vc\include\xhash 684


insert
接受单个参数,即键-值对,而不是键和值的两个独立参数。所以

hashMap.insert(p,q);
应该是

hashMap.insert(make_pair(p, q));

就像你之前做的几行一样。

这是我今天为LeetCode上的同一个问题编写的代码,耗时108毫秒,我一次就解决了这个问题,没有使用额外的数据结构

 /**
 * 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;

}
};

调用make pair时是否尝试指定类型,例如:@clancer问题是在没有make_pair的情况下调用insert。看看迈克的答案。