1. 深度复制带随机指针链表的完整解析
链表操作是数据结构中的基础课题,但带随机指针的链表复制问题却让不少开发者头疼。今天我们就来彻底拆解这个经典算法问题,分享一个时间复杂度O(n)、空间复杂度O(1)的优雅解法。
这个算法之所以特别,在于它巧妙地利用原链表结构建立新旧节点的映射关系,避免了使用额外哈希表带来的空间开销。整个过程就像是在原链表上"编织"出一个完美副本,最后再将其分离出来。下面我们就分步骤详细解析这个精妙的算法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题定义与基础结构
2.1 链表节点定义
首先我们来看这个特殊链表节点的定义:
python复制class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
每个节点除了标准的val和next指针外,还包含一个random指针,它可以指向链表中的任意节点或为空。我们的任务是创建一个这个链表的"深拷贝"——即完全独立的新链表,其中每个新节点的val、next和random指针都与原链表对应节点相同。
2.2 深拷贝的特殊挑战
普通链表的复制很简单,只需顺序遍历并创建新节点即可。但带随机指针的链表复制面临两个核心难题:
- 随机指针的滞后性:当我们创建新节点时,它指向的随机节点可能尚未被创建
- 映射关系的维护:需要准确记录原节点与新节点的对应关系,才能正确设置random指针
传统解法使用哈希表存储原节点到新节点的映射,但这需要O(n)的额外空间。我们今天要介绍的算法则通过链表自身的结构来维护这种映射关系。
3. 算法核心思路与实现
3.1 整体三步走策略
算法的核心思路分为三个精妙的步骤:
- 节点复制:在原链表的每个节点后插入它的复制节点
- 随机指针设置:为每个复制节点设置正确的random指针
- 链表分离:将交错的原链表和复制链表分离
这种方法的精妙之处在于,它利用链表自身的next指针来隐式维护新旧
