1. 随机链表复制:深拷贝的艺术与实现
链表复制看似简单,但当节点包含随机指针时,问题就变得复杂起来。我第一次遇到这个问题是在准备某大厂面试时,当时觉得"不就是复制节点吗",结果被面试官追问到哑口无言。这道题考察的不仅是编码能力,更是对数据结构关系的理解深度。
1.1 问题本质与难点分析
随机链表复制要求实现深拷贝,这意味着:
- 需要创建全新的节点对象
- 新节点的next和random指针必须指向新创建的对应节点
- 原链表与新链表不能有任何对象级别的交叉
核心难点在于random指针可能指向链表中的任意节点,甚至是null。当我们在复制节点时,目标节点可能尚未创建,这就形成了"先有鸡还是先有蛋"的困境。
1.2 哈希表解法:空间换时间的经典案例
最直观的解法是使用哈希表存储原节点与新节点的映射关系:
python复制def copyRandomList(head):
if not head:
return None
mapping = {}
curr = head
# 第一轮遍历:创建所有新节点并建立映射
while curr:
mapping[curr] = Node(curr.val)
curr = curr.next
# 第二轮遍历:完善新节点的指针关系
curr = head
while curr:
new_node = mapping[curr]
new_node.next = mapping.get(curr.next)
new_node.random = mapping.get(curr.random)
curr = curr.next
return mapping[head]
这个解法时间复杂度O(n),空间复杂度O(n)。虽然效率不错,但面试官往往会追问:"能否用O(1)额外空间解决?"
1.3 节点穿插法:巧妙的原地算法
更优的解法是将新节点穿插在原节点之间:
python复制def copyRandomList(head):
if not he
