剑指offer 复杂链表的复制

描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。

对于每一个节点,创建一个辅助节点,比如1-2-3-4-null,就变成1-1-2-2-3-3-4-4-null,然后第一个节点的random节点的后一个节点就是就是第一个节点后一个节点的random,例如1的random是第一个3节点,然后1节点后面的节点1'的random节点就在第一个3节点的后面3',最后再把两个链表拆分开来就可以了

 java代码

public RandomListNode Clone(RandomListNode head) {
        if(head==null)return null;
        for(RandomListNode node=head;node!=null;node=node.next.next){
            RandomListNode newNode=new RandomListNode(node.label);
            newNode.next=node.next;
            node.next=newNode;
        }
        for (RandomListNode node=head;node!=null;node=node.next.next){
            RandomListNode newNode=node.next;
            newNode.random=(node.random!=null)?node.random.next:null;
        }
        RandomListNode newHead=head.next;
        for (RandomListNode node=head;node!=null;node=node.next){
            RandomListNode newNode=node.next;
            node.next=node.next.next;
            newNode.next=(newNode.next!=null)?newNode.next.next:null;
        }
        return newHead;
    }

此题还可以通过hash表的方法节答,第一次复制链表的时候只复制next节点,然后把每个节点存在hashmap中,然后再次遍历random节点与map中存储的节点比较就能知道random是哪个节点了,代码这边就不写了,有兴趣的可以自己尝试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻身小咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值