Copy List with Random Pointer

Copy List with Random Pointer

  Total Accepted: 14031  Total Submissions: 61754 My Submissions

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;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值