Python中链表的复制带随机指针的节点
在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。
相关文章