复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
step1:先在当前结点与下一个结点之间插入当前结点的副本;
step2:根据当前旧结点的random域,链接其副本的random域;
step3:断开源结点与其副本的链接,分成新旧两个链表。
代码
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead == NULL)
return NULL;
RandomListNode* pCur = pHead;
while(pCur != NULL){ //在pCur和pCur->next之间插入pCur的副本
RandomListNode* ptmp = new RandomListNode(pCur->label);
ptmp->next = pCur->next;
pCur->next = ptmp;
pCur = ptmp->next;
}
pCur = pHead;
RandomListNode* pRandom;
RandomListNode* pNew;
while(pCur != NULL){ //根据pCur的random,链接pNew的random
pNew = pCur->next;
pRandom = pCur->random;
if(pRandom != NULL)
pNew->random = pRandom->next;
pCur = pNew->next;
}
RandomListNode* pResHead = pHead->next;
pNew = pResHead;
pCur = pNew->next;
pHead->next = pCur; //最后加上这一句就没问题了,原因是没有断开两个头结点之间的链接
while(pCur != NULL){ //分成旧链表和新链表
pNew->next = pCur->next;
pNew = pNew->next;
if(pNew){
pCur->next = pNew->next;
pCur = pCur->next;
}
}
return pResHead;
}
};