数据结构与算法之链表 链表克隆边界 带随机指针的空链表

数据结构与算法阿木 发布于 17 天前 3 次阅读


链表克隆:带随机指针的空链表克隆边界问题解析与实现

链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在带随机指针的链表中,每个节点除了指向下一个节点的指针外,还有一个指向任意节点的随机指针。这种链表在许多应用场景中都有出现,如深度优先搜索(DFS)中的回溯、图中的邻接表表示等。

克隆一个带随机指针的链表是一个经典的算法问题,其难点在于如何正确复制每个节点的随机指针。本文将围绕这一主题,深入解析链表克隆问题的解决方案,并给出相应的代码实现。

链表克隆问题分析

假设有一个带随机指针的链表,我们需要克隆这个链表,使得克隆链表中的每个节点都与原链表中的对应节点一一对应,并且克隆链表中的随机指针也要正确复制。

问题难点

1. 节点结构:原链表节点包含数据和两个指针,一个指向下一个节点,一个指向随机节点。

2. 随机指针复制:如何确保克隆链表中的随机指针指向正确的节点。

解决思路

1. 创建克隆节点:遍历原链表,为每个节点创建一个克隆节点,并将克隆节点插入到原节点之后。

2. 设置随机指针:遍历原链表,为每个克隆节点的随机指针设置正确的节点。

3. 恢复原链表:将克隆节点从原链表中分离出来,恢复原链表的结构。

代码实现

以下是用Python语言实现的链表克隆代码:

python

class Node:


def __init__(self, x):


self.val = x


self.next = None


self.random = None

def cloneRandomList(head):


if not head:


return None

Step 1: 创建克隆节点并插入到原节点之后


cur = head


while cur:


new_node = Node(cur.val)


new_node.next = cur.next


cur.next = new_node


cur = new_node.next

Step 2: 设置克隆节点的随机指针


cur = head


while cur:


if cur.random:


cur.next.random = cur.random.next


cur = cur.next.next

Step 3: 分离原链表和克隆链表


cur = head


new_head = head.next


while cur:


new_node = cur.next


cur.next = new_node.next


cur = cur.next


if cur:


new_node.next = cur.next

return new_head

测试代码


def printList(head):


cur = head


while cur:


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


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


cur = cur.next

创建测试链表


node1 = Node(1)


node2 = Node(2)


node3 = Node(3)


node1.next = node2


node2.next = node3


node1.random = node3


node2.random = node1

克隆链表


cloned_head = cloneRandomList(node1)

打印原链表和克隆链表


print("Original List:")


printList(node1)


print("Cloned List:")


printList(cloned_head)


总结

本文深入分析了带随机指针的链表克隆问题,并给出了相应的代码实现。通过创建克隆节点、设置随机指针和恢复原链表三个步骤,我们成功克隆了一个带随机指针的链表。在实际应用中,链表克隆问题可以应用于各种场景,如图数据结构的复制、深度优先搜索中的回溯等。