📅  最后修改于: 2023-12-03 14:50:01.148000             🧑  作者: Mango
双向链表是一种链式结构,其中每个节点都包含两个指针,一个指向前一个节点,另一个指向后一个节点。与单向链表相比,双向链表可以在O(1)时间内向前或向后遍历。
在一个双向链表中,每个节点有一个指向随机节点的指针。这种指针被称为随机指针。
给定一个带有随机指针的双向链表,随机指针指向链表中的任意一个节点或空节点。请修正这个链表,使得每个节点的随机指针都指向正确的节点。
我们可以使用哈希表来存储原链表中每个节点和它的克隆节点。这样可以避免重复地创建新节点并在链表中查找节点。接下来,我们对原链表进行两次遍历。在第一次遍历中,我们创建每个节点的克隆节点,并将原节点和克隆节点一一对应地存储在哈希表中。在第二次遍历中,我们根据哈希表中存储的信息修正克隆节点的next和random指针。
class Node:
def __init__(self, val=0, next=None, random=None):
self.val = val
self.next = next
self.random = random
def clone(head):
if head is None:
return None
# 第一遍遍历,创建克隆节点,并将节点和克隆节点存入哈希表
node_map = {}
curr = head
while curr:
node_map[curr] = Node(curr.val, None, None)
curr = curr.next
# 第二遍遍历,修正克隆节点的next和random指针
curr = head
while curr:
if curr.next:
node_map[curr].next = node_map[curr.next]
if curr.random:
node_map[curr].random = node_map[curr.random]
curr = curr.next
return node_map[head]
时间复杂度:O(n),其中n是链表中的节点数。第一遍遍历需要O(n)的时间创建克隆节点并将节点和克隆节点存入哈希表,第二遍遍历需要O(n)的时间修正克隆节点的next和random指针。
空间复杂度:O(n),其中n是链表中的节点数。哈希表中存储每个节点和它的克隆节点,所以空间复杂度是O(n)。