数据结构与算法之链表 链表复制 带随机指针的优化

数据结构与算法阿木 发布于 2025-07-11 9 次阅读


链表复制(带随机指针的优化)技术解析与实现

链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在许多算法和系统中,链表扮演着重要的角色。本文将围绕链表复制这一主题,特别是带随机指针的链表复制问题,进行深入探讨。

链表复制概述

链表复制问题可以分为两种情况:普通链表复制和带随机指针的链表复制。普通链表复制相对简单,只需创建一个新的链表,复制每个节点的值即可。而带随机指针的链表复制则要复杂得多,因为除了复制节点的值,还需要正确复制节点的随机指针。

带随机指针的链表复制问题

假设有一个链表,每个节点包含一个整数值和一个随机指针,随机指针可能指向链表中的任意节点,也可能为空。我们的目标是复制这个链表,使得复制后的链表结构与原链表相同,包括节点的值和随机指针。

解决方案

为了解决带随机指针的链表复制问题,我们可以采用以下步骤:

1. 创建一个映射表:将原链表中的每个节点映射到其对应的复制节点。

2. 复制节点值:遍历原链表,复制每个节点的值到对应的复制节点。

3. 复制随机指针:利用映射表,将原链表中每个节点的随机指针复制到对应的复制节点。

代码实现

以下是一个使用Python实现的带随机指针的链表复制算法:

python

class Node:


def __init__(self, val=0, next=None, random=None):


self.val = val


self.next = next


self.random = random

def copyRandomList(head):


if not head:


return None



Step 1: 创建映射表


old_to_new = {}


new_head = Node(head.val)


old_to_new[head] = new_head



Step 2: 复制节点值并创建映射表


current = head.next


while current:


new_node = Node(current.val)


old_to_new[current] = new_node


new_head.next = new_node


new_head = new_node


current = current.next



Step 3: 复制随机指针


current = head


while current:


if current.random:


old_to_new[current].random = old_to_new[current.random]


current = current.next



return new_head

测试代码


def printList(head):


current = head


while current:


random_val = 'None' if not current.random else current.random.val


print(f'Value: {current.val}, Random: {random_val}')


current = current.next

创建测试链表


node1 = Node(1)


node2 = Node(2)


node3 = Node(3)


node1.next = node2


node2.next = node3


node2.random = node1


node3.random = node2

复制链表


copy_head = copyRandomList(node1)

打印原链表和复制后的链表


print("Original List:")


printList(node1)


print("Copied List:")


printList(copy_head)


分析

上述代码首先创建了一个映射表`old_to_new`,用于存储原链表节点与其复制节点之间的映射关系。然后,遍历原链表,复制每个节点的值,并创建对应的复制节点。根据原链表节点的随机指针,更新复制节点的随机指针。

时间复杂度和空间复杂度

该算法的时间复杂度为O(n),其中n是链表中的节点数量。空间复杂度也为O(n),因为我们需要存储映射表。

总结

带随机指针的链表复制是一个经典的算法问题,通过巧妙地使用映射表,我们可以有效地解决这个问题。本文详细介绍了该问题的解决方案,并提供了Python代码实现。希望这篇文章能够帮助读者更好地理解链表复制(带随机指针的优化)这一主题。