在来做题目之前,需要了解两个概念——浅拷贝和深拷贝
- 浅拷贝:只新增对象的引用,而不会复制对象本身
- 深拷贝:复制对象本身
在Python中关于浅拷贝和深拷贝的区别,还有更加深刻的解释,在此不赘述,可自行百度。就本题而言,够了。
一开始做这道题没有读清楚题意,鉴于对深拷贝的理解,所以采用了递归,但不可行。在这里每个节点都含有next对象和random对象,random指向的对象是存在于next链表中的,换一句话说,就是链表有环,所以递归复杂了。
在这里总结一下大神题解的思路。
- 第一次next遍历,造出新对象,用字典记录新旧节点之间的对应关系
- 第二次next遍历,复制对象之间的关系。取出新节点,把新节点的next指向 dict[ 旧节点.next ] ,把新节点的random指向 dict[ 旧节点.random ]。
- 返回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]