主程序包含三大步:
(1)将链表的每个结点复制下来,并将依次连接在对应结点的后面,将其random域设为空;
(2)拷贝random域:复制结点的random域是原始结点对应的random结点的下一个;
(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)
{
if(pHead == NULL) return NULL;
RandomListNode* pNode = pHead;
while(pNode!= NULL){
RandomListNode* s = new RandomListNode(pNode->label);
s->next = pNode->next;
s->random = NULL;
pNode->next = s;
pNode = s->next;
}
pNode = pHead;
while(pNode != NULL){
RandomListNode* s = pNode->next;
if(pNode->random != NULL)
s->random = pNode->random->next;
pNode = s->next;
}
RandomListNode* copycur = pHead->next;
RandomListNode* tmp;
pNode = pHead;
while(pNode->next != NULL){
tmp = pNode->next;
pNode->next = tmp -> next;
pNode = tmp;
}
return copycur;
}
};