返回

深度探秘 LeetCode 剑指 Offer 35:破解复杂链表复制之谜

前端

LeetCode 剑指 Offer 35:复杂链表的复制

问题

剑指 Offer 35 要求我们实现一个 copyRandomList 函数,该函数可以复制一个具有随机指针的复杂链表。在复杂链表中,每个节点不仅有一个指向下一个节点的 next 指针,还有一个指向任意其他节点或 nullrandom 指针。

解决方案

要复制具有随机指针的复杂链表,我们需要采取以下步骤:

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 的难题。这趟技术进阶之旅不仅提升了我们的算法和数据结构技能,也为我们解锁了解决复杂编程挑战的新思路。