题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
提交链接:点击
思路:
分为三步 1.首先遍历复杂链表,每遍历一个节点A,创建其副本A1,并让A->next=A1 2.再一次复杂链表,并将老节点的随机指针给新节点,即A1->random=A->random->next 3.挑选出新节点,即为新链表
代码:
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { /* 分为三步 1.首先遍历复杂链表,每遍历一个节点A,创建其副本A1,并让A->next=A1 2.再一次复杂链表,并将老节点的随机指针给新节点,即A1->random=A->random->next 3.挑选出新节点,即为新链表 */ if(!pHead) return NULL; RandomListNode *p,*q; p=q=pHead; //第1步 while(p!=NULL){ q=p->next;//当前节点的下一个节点 RandomListNode *newNode= new RandomListNode(p->label); p->next=newNode; //指向新节点 newNode->next=q; p=q; } p=pHead; //第2步 while(p!=NULL){ if(!p->random){ p->next->random=NULL; }else p->next->random=p->random->next; p=p->next->next; } //第3步 p=pHead; q=pHead->next; RandomListNode *temp; while(p->next!=NULL){ temp=p->next; p->next=temp->next; p=temp; } return q; } };