A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
pro:一个链表有random pointer,这个指针指向链表中的任意一个节点。需要完成链表的深拷贝。
sol:
复制每个节点,节点的copy插入到源节点后面如1 2 3 4,复制成1 1‘ 2 2’ 3 3‘ 4 4’;
然后在上述链表基础上,拷贝random节点,新节点的random等于旧节点的random的next,需要判断random为NULL的情况;
然后恢复原链表和新链表。用一个originnext变量记录原链表当前节点的下一个节点。变量顺序是(cur,next,originnext,originnext->next).恢复的顺序是next的next是originnext的next,cur的next是originnext,然后cur等于originnext,next等于originnext的next。
code:
/**
* 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)
{
if(head==NULL)
return NULL;
RandomListNode *cur,*next,*originnext,*res;
cur=head;
while(cur!=NULL)
{
RandomListNode *temp = new RandomListNode(cur->label);
temp->next = cur->next;
cur->next= temp;
cur = temp->next;
}
cur = head;
next = cur->next;
while(1)
{
if(cur->random!=NULL)
{
next->random = cur->random->next;
}else
next->random = NULL;
if(next->next==NULL) break;
else
{
cur = next->next;
next = cur->next;
}
}
cur = head;
res = next = cur->next;
while(1)
{
if(next->next!=NULL)
{
originnext = next->next;
cur->next = originnext;
next->next = originnext->next;
cur = originnext;
next = originnext->next;
}else
{
cur->next = NULL;
break;
}
}
return res;
}
};