您的位置:首页 > 运维架构

Copy List with Random Pointer

2014-09-11 10:45 309 查看

Copy List with Random Pointer

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上的,深拷贝一个带有random指针的链表。
分析:分三步走,

在每个节点后面copy一个该节点,如 1->2-> 3 变成 1 ->1 ->2 ->2 ->3 ->3 ,先不考虑random指针。
拷贝random指针,后一个的random等于原先节点random->next
分离链表的奇偶节点。
代码:注意p->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 {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(!head ) return head;//|| head->next==NULL 只有一个节点,也要深拷贝,即new
cloneList(head);
copyRandomPointer(head);
return split(head);

}
void cloneList(RandomListNode *head){//每个后面copy一个一份,不copy random指针
if(!head) return ;
RandomListNode *p=head;
while(p){
int x=p->label;
RandomListNode *c=new RandomListNode(x);
c->next=p->next;
p->next=c;
p=c->next;
}
}

void copyRandomPointer(RandomListNode *head){//copy random指针,保证链表个数为偶数
if(!head) return ;
RandomListNode *p=head;
RandomListNode *pc=head->next;
while(p && pc){
if(p->random){
pc->random=p->random->next;
}
p=p->next->next;//如果p到达末尾,为NULL
if(p) pc=p->next;
else break;
//pc=pc->next->next;//这里会指飞,只有一个节点的时候
}
}

RandomListNode *split(RandomListNode *head){
if(!head) return head;
RandomListNode *p=head;
RandomListNode *pc=head->next;
RandomListNode *res=pc;
while(p && pc){
p->next=pc->next;
p=p->next;
if(p){//p先到达NULL p->next会指飞
pc->next=p->next;
pc=pc->next;
}
}

return res;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  random pointer copy