📅  最后修改于: 2023-12-03 15:12:42.198000             🧑  作者: Mango
给定一个链表,其中每个节点都包含一个随机指针,该指针可能指向链表中的任何节点或空节点。请对此链表进行深度复制。请注意,该克隆列表应该与原始列表具有相同的结构,并具有相同的节点值和随机指针的目标。
def copyRandomList(head: 'Node') -> 'Node':
输入格式:
输出格式:
因此,你需要实现Node类,从而使得Node节点按输入输出格式可传递。
输入
1 -> 2 -> 3 -> 4 -> None
| | | |
v v v v
3 1 4 2
输出
1’ -> 2’ -> 3’ -> 4’ -> None
| | | |
v v v v
3’ 1’ 4’ 2’
本题要求我们实现一个复制链表。需要注意的是,链表中存在随机指针,因此我们需要对每个节点进行深度拷贝,并重新复制一份随机指针指向。在深度拷贝时,由于我们不能直接获得链表长度,因此需要使用一个哈希表来做节点映射,将原来的节点和新的节点一一对应。
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
def copyRandomList(head: 'Node') -> 'Node':
if not head:
return None
nodes_dict = dict()
new_head = Node(head.val)
nodes_dict[head] = new_head
old_node = head
new_node = new_head
# Copy the linked list without the random pointer
while old_node.next:
new_node.next = Node(old_node.next.val)
nodes_dict[old_node.next] = new_node.next
old_node = old_node.next
new_node = new_node.next
# Copy the linked list with the random pointer
old_node = head
new_node = new_head
while old_node:
if old_node.random:
new_node.random = nodes_dict[old_node.random]
old_node = old_node.next
new_node = new_node.next
return new_head
注:部分参考了leetcode官方题解。