题目
\qquad 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
代码
/*
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(NULL==pHead){
return pHead;
}
RandomListNode* currentNode=pHead;
while(currentNode){
RandomListNode* cloneNode = new RandomListNode(currentNode->label);
cloneNode->next=currentNode->next;
currentNode->next=cloneNode;
currentNode=cloneNode->next;
}
//对每个节点都进行复制。A复制成A'。
//并把A'放在A的后面。
currentNode=pHead;
while(currentNode){
RandomListNode*nextNode=currentNode->next;
if(currentNode->random){
nextNode->random=currentNode->random->next;
}
currentNode=nextNode->next;
}
//这里是把A和A'的random指针域处理好。
RandomListNode *pCloneHead = pHead->next;
RandomListNode *tmp;
currentNode = pHead;
while(currentNode->next){
tmp = currentNode->next;
currentNode->next =tmp->next;
currentNode = tmp;
}
//这里是把奇数位和偶数位的分开链接起来。
return pCloneHead;
}
};