138. 复制带随机指针的链表

在这里插入图片描述
python中的copy,deepcoy
如果没有random指针,只要依次遍历原链表,每次创建一个新节点等于原链表节点,然后依次连接新节点即可完成deepcopy
由于random指针,复制新节点时,random指针随机指向任意的原链表节点,而如果该原节点还没有被拷贝,新链表就会指向原链表,使deepcopy失败
思路:遍历两次,第一次遍历复制所有节点,同时创建一个哈希表,key为原结点,value为复制的新节点
第二次遍历来调整next指针,使用哈希表中的value替换random指向的原节点
注意:1.在dict中添加None的键,不然会报错
2.第一次遍历复制节点时不能new=head,这样new的指针还会指向原链表,应该创建val=head.val的新节点

class Solution(object):
    def copyRandomList(self, head):
    	#检查是否为空链表#
        if head is None:return head
        hash=dict()
        dummy=Node(0,next=None)
        pre=dummy
        p=head
        #第一次遍历,复制val并确定next指针,同时哈希表储存原节点与对应新节点#
        while p:
            new=Node(p.val)
            hash[p]=new
            pre.next=new
            pre=new
            p=p.next
        #哈希表中添加None的键,不然会报错#
        hash[None]=None
        newhead=dummy.next
        p=head
        #第二次遍历,新链表的random指针指向哈希表中对应的新节点#
        while p:
            newhead.random=hash[p.random]
            newhead=newhead.next
            p=p.next
        return dummy.next

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值