尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
hot100 随机链表的复制(138)
本题采用哈希表映射算法解决包含随机指针的特殊单链表深拷贝问题。其核心本质是建立原节点与新克隆节点间的一一映射关系通过两遍线性扫描将复杂的图状拓扑结构复制解耦为独立的“节点创建”与“引用缝合”两个阶段。当前提供的源码实现了在时间复杂度 O(N) 和额外空间复杂度 O(N) 条件下的全局最优解最终走向是完整重构出与原链表物理隔离但拓扑结构完全一致的全新链表。一、 问题本质与数据模型对于普通的单链表深拷贝只需顺着next指针一路创建新节点并拼接即可。然而本题的节点引入了random指针该指针可以指向链表中的任意节点或null。这种随机指向导致链表具备了有向图的拓扑特征甚至可能包含环路。如果采用传统的单遍扫描当处理到节点 X 时其random指针可能指向后继节点 Y而此时 Y 尚未被实例化控制流将因缺乏操作对象而陷入死锁。为了解除这种前向依赖的困局算法引入了“哈希表空间映射模型MapNode, Node”。该模型将复制流程彻底拆分为两步第一步只造节点不连指针线性遍历原链表为每个原节点单独克隆一个数值相同、但处于孤立状态的新节点并记录在哈希表中Key 为原节点地址Value 为新节点地址。第二步不造节点只连指针再次遍历原链表利用哈希表作为索引桥梁跨越空间物理限制精准缝合所有新节点的next与random引用。二、 算法演进对比在解决带随机指针链表的深拷贝问题时哈希表映射法在工程可读性与健壮性上具备明显的优势解法名称时间复杂度空间复杂度核心原理物理瓶颈 / 缺陷原地拼接拆分法O(N)O(1)将克隆节点直接插入对应原节点之后形如 A - A - B - B利用相对位置设置random最后将交错的链表拆分还原不需要额外存储容器但需要多次修改原链表的拓扑结构代码逻辑较为繁琐且易出错哈希表映射法当前解法O(N)O(N)利用哈希表显式维护新旧节点的空间映射第一遍克隆节点第二遍通过哈希表缝合指针需要开辟与链表长度呈线性正比的哈希表空间内存开销随节点规模扩大而增大三、 核心分支控制逻辑与决策证明当前源码的控制流由两个独立的while (cur ! null)循环串联而成其内部决策及边界处理证明如下1. 独立实体映射第一遍while循环执行map.put(cur, new Node(cur.val));数学证明原链表拥有 N 个物理节点。通过该循环哈希表中将精准存入 N 对键值对。新节点在内存中独立开辟其next和random初始均默认为null。结论完成了所有新节点实体的创建消除了后续指针缝合时“目标节点不存在”的风险。2. 拓扑关系缝合第二遍while循环执行map.get(cur).next map.get(cur.next); map.get(cur).random map.get(cur.random);决策证明由于第一步已经建立了全量映射对于任意原指针指向的节点cur.next或cur.random都可以通过map.get()在常数阶 O(1) 时间内获取其对应的克隆节点。边界证明Null 防御当原节点的指针指向null时例如尾节点的next或者某些没有随机指向的random由于哈希表中未存储null键执行map.get(null)将直接返回 Java 原生的null。结论利用map.get(null) null的底层特性算法无缝处理了链表的末梢边界与空随机指针使指针缝合逻辑实现了完全的代码归一化。四、 算法执行状态机步进示例以输入链表head [[7, null], [13, 0]]为例原链表含两个节点N0 值为 7random 指向 nullN1 值为 13random 指向 N0。克隆生成的对应新节点记为 C0 和 C1。其状态演进如下表所示步骤cur 当前指向阶段与核心控制动作哈希表当前状态 (Key - Value)克隆链表当前拓扑状态1-1N0 (7)阶段一创建 C0 并存入哈希表{N0 - C0}C0 孤立存在1-2N1 (13)阶段一创建 C1 并存入哈希表{N0 - C0, N1 - C1}C0, C1 均孤立存在1-3null阶段一结束cur指针重置回head(N0){N0 - C0, N1 - C1}节点实体全量就绪准备缝合关系2-1N0 (7)阶段二缝合 C0 的next与random{N0 - C0, N1 - C1}C0.next C1;C0.random map.get(null) - null2-2N1 (13)阶段二缝合 C1 的next与random{N0 - C0, N1 - C1}C1.next map.get(null) - null;C1.random C02-3null阶段二结束触发return map.get(head);{N0 - C0, N1 - C1}最终形态C0(7)-C1(13)-null且 C1.random 指向 C0五、 源码实现/* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val val; this.next null; this.random null; } } */ class Solution { public Node copyRandomList(Node head) { // 创建哈希表用于存储原节点到新克隆节点的空间物理映射 MapNode, Node map new HashMap(); // 初始化工作指针 cur 指向原链表头节点 Node cur head; // 步骤 1第一遍线性扫描仅克隆节点实体并存入映射表 while (cur ! null) { map.put(cur, new Node(cur.val)); cur cur.next; } // 将工作指针重新重置回原链表头部准备进行拓扑缝合 cur head; // 步骤 2第二遍线性扫描利用映射表恢复新链表的 next 与 random 指向 while (cur ! null) { // 让新节点的 next 指针指向原后继节点对应的克隆后继 map.get(cur).next map.get(cur.next); // 让新节点的 random 指针指向原随机节点对应的克隆随机节点 map.get(cur).random map.get(cur.random); // 控制指针后移 cur cur.next; } // 从哈希表中提取并返回原头节点对应的克隆头节点 return map.get(head); } }六、 复杂度分析1. 时间复杂度O(N)分析算法显式包含了两个独立的单重while循环。第一个循环遍历原链表长度 N执行 N 次哈希表插入操作第二个循环同样遍历长度 N执行 N 次哈希表查询与指针重定向操作。由于HashMap的put与get操作在平均情况下的时间复杂度均为常数阶 O(1)。结论总的计算耗时与链表的节点总数 N 呈严格的线性正比关系。2. 空间复杂度O(N)分析算法在运行全流程中构建了一个HashMap用于维系映射关系。该映射表内部存储了 N 个键值对其占用的内存空间随输入链表的节点规模线性膨胀。结论除去作为返回值所必须开辟的新链表存储空间外该算法引入的外部辅助空间复杂度为线性阶 O(N)。
RELATED

相关推荐

AI Agent 框架大比拼:LangChain vs LlamaIndex vs AutoGen vs CrewAI 选型指南

AI Agent 框架大比拼:LangChain vs LlamaIndex vs AutoGen vs CrewAI 选型指南

TL;DR:做 AI Agent 该用哪个框架?LangChain 全家桶、LlamaIndex 检索专精、AutoGen 多 Agent 对话、CrewAI 角色扮演协作。本文从设计哲学、适用场景、代码示例、性能四个维度对比,帮你选对框架。 1. 先说结论 🔧 LangChain 定…

📅 2026/11/2 18:45:46
Free-NTFS-for-Mac 架构解析:跨平台文件系统读写的最佳实践

Free-NTFS-for-Mac 架构解析:跨平台文件系统读写的最佳实践

Free-NTFS-for-Mac 架构解析:跨平台文件系统读写的最佳实践 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manageme…

📅 2026/10/4 7:20:57
python神经网络编程入门(四)----神经网络误差反向传播完全图解

python神经网络编程入门(四)----神经网络误差反向传播完全图解

上一期我们学会了用矩阵乘法这个“偷懒神器”做前向传播——把输入信号一层层往前推,最后算出输出结果。但算完一看,结果跟正确答案差了一大截。问题出在哪?出在我们当初瞎编的那些权重上。那怎么让这些权重“知错能改”呢?这就需…

📅 2026/11/2 22:08:28
MORE NEWS

更多资讯

📰

华为云部署Ward服务器监控系统实战指南

1. 项目背景与核心价值Ward作为一款轻量级的服务器监控工具,凭借其简洁的界面和低资源消耗特性,近年来在开发者群体中广受欢迎。而华为开发者空间提供的云原生环境,则为这类工具的部署提供了稳定可靠的运行平台。这次实践的核心目标&#xff…

📰

DLMS协议电表通讯详解:三层模型、HDLC帧与ASN.1编码

简介:《DMLS协议中文版》是一份面向电能量数据采集终端开发者、电能表通讯调试人员及IEC62056/DLMS协议学习者的中文说明手册,主要用于解决采集器与电能表按DLMS协议族通讯时的协议理解、报文对照和调试参考问题。压缩包内共1个doc文件,约620…

📰

TDengine时序数据库WebSocket实时订阅方案设计与优化

1. 项目背景与核心挑战 时序数据库在现代物联网和工业互联网场景中扮演着关键角色,而TDengine作为一款高性能的时序数据库,其数据订阅能力直接影响着实时监控、预警等关键业务场景的响应速度。传统HTTP轮询方式在实时性、服务器压力和带宽消耗等方面存在…

📰

快速排序算法实现与工程优化全解析

1. 快速排序算法全景解析快速排序作为20世纪十大经典算法之一,由Tony Hoare于1959年发明,其平均时间复杂度达到O(nlogn)的优异表现,使其成为实际应用中最高效的排序算法之一。不同于归并排序需要额外存储空间,快速排序通过原地分区…

📰

金融风控AI实战:从模型构建到生产部署

1. 金融风控领域的AI革命 三年前我在某商业银行第一次接触信用卡欺诈检测系统时,整个风控团队还在用传统的规则引擎加人工审核的方式。每天凌晨三点,风控专员们需要手动检查数百条触发规则的交易,误报率高达70%。直到我们引入第一个机器学习模…

📰

大模型时代数据质量管理:Rubric解决方案与实践

1. 数据质量管理的核心矛盾与Rubric解决方案在大模型时代,数据质量的重要性不言而喻,但真正落地执行时却面临诸多挑战。我从事AI数据质量管理多年,深刻体会到规模与质量之间的张力并非不可调和。Rubric(评分量表)正是解…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬