问题描述
现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。
请对这个链表进行深拷贝。
方案
深拷贝就是完全复制出另一个链表
如果单纯的按照先后顺序拷贝结点,不能保证前后拷贝的相同random的结点是同一个结点(这句话比较绕)
思路分为三步:
- 在每个原结点后面插入与原结点label相同的新结点
- 改变新结点的random指针的指向,即原结点random指向结点的next(新结点)
- 将新结点提取出来,即使每一个新结点的next指向下一个新结点
/**
* 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 {
typedef RandomListNode node;
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head==NULL ||(head->next==NULL && head->random == NULL))return head;
//拷贝每个结点到原结点后面生成新结点
node *copy=head,*newnode;
while(copy!=NULL){
newnode = new node(copy->label);
newnode->next=copy->next;
copy->next = newnode;
copy=newnode->next;
}
//为新结点添加random指针
node *oldnode=head;
while(oldnode!=NULL){
node *newnode = oldnode->next;
newnode->random = (oldnode->random!=NULL)?oldnode->random->next:NULL;
oldnode=oldnode->next->next;
}
//提取新结点,生成新结点的next指针
newnode=copy=head->next;
while(copy!=NULL&©->next!=NULL){
copy->next=copy->next->next;
copy=copy->next;
}
return head->next;
}
};