剑指-25 复杂随机链表的深拷贝

在来做题目之前,需要了解两个概念——浅拷贝和深拷贝

  • 浅拷贝:只新增对象的引用,而不会复制对象本身
  • 深拷贝:复制对象本身

在Python中关于浅拷贝和深拷贝的区别,还有更加深刻的解释,在此不赘述,可自行百度。就本题而言,够了。

一开始做这道题没有读清楚题意,鉴于对深拷贝的理解,所以采用了递归,但不可行。在这里每个节点都含有next对象和random对象,random指向的对象是存在于next链表中的,换一句话说,就是链表有环,所以递归复杂了。

在这里总结一下大神题解的思路。

  1. 第一次next遍历,造出新对象,用字典记录新旧节点之间的对应关系
  2. 第二次next遍历,复制对象之间的关系。取出新节点,把新节点的next指向 dict[ 旧节点.next ] ,把新节点的random指向 dict[ 旧节点.random ]。
  3. 返回dict[ 旧链表头 ] 。特殊情况,如果旧节点为空,返回空
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        m = {}
        pnode = pHead
        # 先建立按照顺序新旧节点的映射
        while pnode:
            node = RandomListNode(pnode.label)
            m[pnode] = node
            pnode = pnode.next

        pnode = pHead
        # 然后调整新节点之间的关系
        while pnode:
            node = m[pnode]
            node.next =m[pnode.next] if pnode.next else None
            node.random = m[pnode.random] if pnode.random else None
            pnode = pnode.next

        return None if not pHead else m[pHead]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值