复杂链表复制(在原链表上复制后拆开)
复杂链表的复制
http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
/*
p->next = r; // 带 -> 理解为指向 p结点 指向 r 结点 ,p 指针本身不变化
r = r->next; // 不带 -> 理解为赋值; r 代表 r的next r 指针变化后移
};
重新声明空间构造,random 指向的结点 不容易找到。
在原有链表上先复制出新的节点,根据原有链表关系找到新复制的节点
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(!pHead) return NULL;
RandomListNode *p = pHead;
while(p){ // 所有结点复制一份,其复制的结点相邻;
RandomListNode *tmp = new RandomListNode(p->label);
tmp->next = p->next;
p->next = tmp;
p = tmp->next;
}
p = pHead;
while(p){ // random 赋值
if(p->random) p->next->random = p->random->next;
p = p->next->next;
}
p = pHead->next;
RandomListNode *aHead = pHead->next;
while(p){ //生成的链表脱离
RandomListNode *tmp = p->next->next;
p->next = tmp;
p = tmp;
}
return aHead;
}
};

