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.
题意:深度复制一个有随机指针的链表
由于在《剑指Offer》中看见过这个题,所以有思路。但还是想偏了,一开始想直接在原表中赋值节点,将赋值节点P1的random指针指向原节点P的random指针处,待分解成两个链表时再设置P1的random节点。后来证明,分解时设置random节点会致使指针指向错误的节点,因为一边分解一边设置。所以,只能分成三个步骤,先赋值节点,再设置random指针,最后在分解。
RandomListNode *copyRandomList(RandomListNode *head) {//
if(head == NULL) return NULL;
RandomListNode *p = head;
RandomListNode *q = NULL;
while(p){//copy
RandomListNode *np = new RandomListNode(p->label);
q = p->next;
p->next = np;
np->next = q;
//np->random = p->random;//将新节点的random指针也指向原节点的random节点
p = q;
}
//set random
p = head;
while(p){
if(p->random)
p->next->random = p->random->next;
p = p->next->next;
}
//depart
RandomListNode *h = head->next;
p = head;
while(p){
q = p->next;
p->next = q->next;
if(q->next)//这个竟然让我找了好久的错误,设成 if(!q->next)了,汗啊
q->next = q->next->next;
p = p->next;
}
return h;
}