返回
深度探秘 LeetCode 剑指 Offer 35:破解复杂链表复制之谜
前端
2023-10-07 17:52:45
LeetCode 剑指 Offer 35:复杂链表的复制
问题
剑指 Offer 35 要求我们实现一个 copyRandomList
函数,该函数可以复制一个具有随机指针的复杂链表。在复杂链表中,每个节点不仅有一个指向下一个节点的 next
指针,还有一个指向任意其他节点或 null
的 random
指针。
解决方案
要复制具有随机指针的复杂链表,我们需要采取以下步骤:
1. 复制每个节点
首先,我们创建一个新链表,并将新链表的每个节点指向原始链表的对应节点。
def copyRandomList(head: 'Optional[Node]') -> 'Optional[Node]':
if not head:
return None
new_head = Node(head.val)
current = head.next
new_current = new_head
node_map = {head: new_head}
while current:
new_current.next = Node(current.val)
node_map[current] = new_current.next
current = current.next
new_current = new_current.next
return new_head
2. 复制随机指针
接下来,我们需要复制每个节点的 random
指针。我们可以使用前面创建的 node_map
来查找原始链表中对应节点的复制品。
current = head
new_current = new_head
while current:
if current.random:
new_current.random = node_map[current.random]
current = current.next
new_current = new_current.next
return new_head
示例代码
以下示例代码展示了如何使用我们的 copyRandomList
函数复制一个具有随机指针的复杂链表:
# 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
# Test case
head = Node(7)
head.next = Node(13, head)
head.next.next = Node(11, head.next)
head.next.next.next = Node(10, head)
head.next.next.next.next = Node(1, head.next.next)
# Copy the linked list
copied_head = copyRandomList(head)
运行这段代码将输出复制后的复杂链表,其结构与原始链表完全相同,并且每个节点的 random
指针也指向了正确的节点。
总结
通过理解复杂链表的复制原理并编写清晰简洁的代码,我们成功破解了 LeetCode 剑指 Offer 35 的难题。这趟技术进阶之旅不仅提升了我们的算法和数据结构技能,也为我们解锁了解决复杂编程挑战的新思路。