LintCode 105-复制带随机指针的链表

本人电子系,只为一学生。心喜计算机,小编以怡情。


给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。

返回一个深拷贝的链表。


解答思路:既然给了一个random指针,那么就要充分利用。因为是深拷贝,那么我们就要new一个新的节点,让原先的random指向它。
当然,random要保存起来,我选择的用ArrayList来保存。


public RandomListNode copyRandomList(RandomListNode head) {
        // write your code here
        if(head==null) return null;
        ArrayList<RandomListNode> ran=new ArrayList<>();//用于保存Random
        RandomListNode temp=head;
        while(temp!=null)
        {

            RandomListNode linshi=new RandomListNode(temp.label);//建立新的节点
            ran.add(temp.random);//并将旧的random保存(为了之后的赋值)
            temp.random=linshi;//random指向新的节点
            temp=temp.next;
        }
        temp=head;
        while(temp!=null)
        {
            if(temp.next==null)//处理最后一个节点
            {
                temp.random.next=null;
                break;
            }
            temp.random.next=temp.next.random;//让新的节点间彼此建立联系
            temp=temp.next;
        }
        RandomListNode ret=head.random;//建立返回的头结点
        temp=ret;
        int i=0;
        while(temp!=null)
        {
            temp.random=ran.get(i++);//新的也要有同样random,
            //虽然原来的random被破坏了
            //然而你也可以加一句head.random=ran.get(i++)来恢复
            temp=temp.next;
        }
        return ret; 
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值