链表克隆:带随机指针的空链表克隆边界问题解析与实现
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在带随机指针的链表中,每个节点除了指向下一个节点的指针外,还有一个指向任意节点的随机指针。这种链表在许多应用场景中都有出现,如深度优先搜索(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)
总结
本文深入分析了带随机指针的链表克隆问题,并给出了相应的代码实现。通过创建克隆节点、设置随机指针和恢复原链表三个步骤,我们成功克隆了一个带随机指针的链表。在实际应用中,链表克隆问题可以应用于各种场景,如图数据结构的复制、深度优先搜索中的回溯等。
Comments NOTHING