浅拷贝: 返回地址一样的链表。
深拷贝: 返回地址不一样,但关系一致的链表。 所以不能直接简单粗暴的遍历复制, 这样出来的复制是一样的地址,不符合题目的深拷贝要求。
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
if not head:
return None
# 利用哈希映射建立源节点到新节点的映射,key是原节点,value是新节点(新节点就是原节点的复制)
d = {}
cur = head
while cur:
d[cur] = Node(cur.val)
cur = cur.next
# 遍历原节点,寻找新节点的next和random节点
cur = head
while cur:
# cur是原节点,d[cur]是新节点,cur.next是原节点的下一个
# d[cur.next]就是原节点的下一个新节点
if cur.next:
d[cur].next = d[cur.next]
# cur.random是原节点的随机指向
# d[cur.random]是原节点的随机指向 对应的新节点
if cur.random:
d[cur].random = d[cur.random]
cur = cur.next
return d[head]