解题思路:因为每个节点都会随机指向另一个节点,被指向的节点可能是之前出现过的节点,也可能还没出现,为了能判断这个节点是否已经被创建,我们用一个哈希表来储存原来链表中的节点和新节点的对应关系,如果原来节点已经在表中,那说明对应的新节点也已经创建过了,我们直接令指针指向它即可,如果原来节点没有出现在表中,就新创建一个新节点,并将这对节点添加到表中
"""
# 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: 'Node') -> 'Node':
if head is None:
return None
root = Node(head.val)
p2 = root
ori_copy = {head: p2}
p1 = head
while(p1):
if p1.next and p1.next not in ori_copy:
cur = Node(p1.next.val)
ori_copy[p1.next] = cur
if p1.random and p1.random not in ori_copy:
cur = Node(p1.random.val)
ori_copy[p1.random] = cur
if p1.next:
p2.next = ori_copy[p1.next]
if p1.random:
p2.random = ori_copy[p1.random]
p2 = p2.next
p1 = p1.next
return root