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.
一看题目 !这直接返回head不就好了= =虽然肯定不是这样 还是submit的试了下
submission result显示Node with label -1 was not copied but a reference to the original one.
问题出在deep copy上
1. Shallow copy
拷贝时仅仅复制的是 指针 或者 引用, 也就是说 数据仅存在一份。
当然,得到效率的同时,存在的问题就是,如果原来的数据改变了, 复制后的对象也改变了,因为仅仅存在一份数据!!!
Note: 其实是出于效率的考虑,在某些场合,并不需要多份数据时,可以采用 shallow copy
2. Deep copy 就是复制出来一条链 这样原始的链怎么变 新链都不会变 是独立的3. Lazy copy
这是一种上述两种策略的组合。又称为 copy-on-write.
最初复制时,采用效率更高的 shallow copy, 同时用一个计数器 counter 记录当前share数据的对象数目。
当需要对数据进行修改时,根据 counter, 采用 deep-copy,
也就是当需要 deep-copy 时,才调用比较费时的 deep-copy.
1.将新老链表合成一个 aabbccddee
2.new.random=old.random.next
3.分离连个链表
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null)
return null;
RandomListNode p=head;
while(p!=null){
RandomListNode q=p.next;
p.next=new RandomListNode(p.label);
p.next.next=q;
p=q;
}
p=head;
while(p!=null){
p.next.random=p.random==null?null:p.random.next;
p=p.next.next;
}
p=head;
RandomListNode r=head.next;
RandomListNode q=r;
while(p.next!=null){
p.next=q.next;
p=p.next;
if(p==null)break;
q.next=p.next;
q=q.next;
}
return r;
}
}