Python中链表的复制带随机指针的节点

2023-04-11 00:00:00 节点 随机 指针

在Python中,链表的复制带随机指针的节点,可以使用哈希表来辅助实现。

假设我们有一个链表,每个节点都有一个next指针和一个random指针,我们需要复制这个链表并返回复制后的链表头。

算法如下:

1.遍历原链表,将每个节点的值和指针映射到哈希表中。

2.再次遍历原链表,对于每个节点,在哈希表中查找与该节点相同值的复制节点,并将复制节点的next和random指针分别指向相应的节点。

3.返回复制后的链表头。

代码实现如下:

class Node:
    def __init__(self, x):
        self.val = x
        self.next = None
        self.random = None

def copyRandomList(head: 'Node') -> 'Node':
    if head == None:
        return None

    # 哈希表存储原节点和复制节点的映射关系
    hashmap = {}

    # 复制节点不含有具体值
    dummy = Node(-1)
    p = dummy

    # 第一次遍历:复制节点和原节点的映射
    cur = head
    while cur:
        new_node = Node(cur.val)
        hashmap[cur] = new_node
        p.next = new_node
        p = p.next
        cur = cur.next

    # 第二次遍历:建立next和random指针关系
    cur = head
    new_cur = dummy.next
    while cur:
        if cur.next:
            new_cur.next = hashmap[cur.next]
        if cur.random:
            new_cur.random = hashmap[cur.random]
        cur = cur.next
        new_cur = new_cur.next

    return dummy.next

我们可以使用以下代码测试:

# 构造链表
a = Node("p")
b = Node("i")
c = Node("d")
d = Node("a")
e = Node("n")
a.next = b
b.next = c
c.next = d
d.next = e
a.random = e
b.random = c
c.random = c
d.random = None
e.random = b

# 复制链表
new_head = copyRandomList(a)

# 验证
cur1 = a
cur2 = new_head
while cur1:
    assert cur2.val == cur1.val
    if cur1.random:
        assert cur2.random.val == cur1.random.val
    else:
        assert cur2.random == None
    cur1 = cur1.next
    cur2 = cur2.next

注:该代码仅适用于Python3。

相关文章