当前位置: 首页 > news >正文

【算法--链表】138.随机链表的复制--通俗讲解

算法通俗讲解推荐阅读
【算法–链表】83.删除排序链表中的重复元素–通俗讲解
【算法–链表】删除排序链表中的重复元素 II–通俗讲解
【算法–链表】86.分割链表–通俗讲解
【算法】92.翻转链表Ⅱ–通俗讲解
【算法–链表】109.有序链表转换二叉搜索树–通俗讲解
【算法–链表】114.二叉树展开为链表–通俗讲解
【算法–链表】116.填充每个节点的下一个右侧节点指针–通俗讲解


通俗易懂讲解“随机链表的复制”算法题目

一、题目是啥?一句话说清

给你一个链表,每个节点有一个随机指针,指向链表中的任意节点或空。你需要深拷贝这个链表,创建全新节点,并正确设置next和random指针。

示例:

  • 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
  • 输出:复制后的链表,其中每个新节点的random指向新链表中的对应节点。

二、解题核心

使用哈希表来映射原节点到新节点。首先遍历原链表,创建所有新节点并存储映射关系。然后再次遍历原链表,根据映射关系设置新节点的next和random指针。

这就像先复制所有人的身份证(创建新节点),然后根据原关系网(原链表)来建立新关系网(新链表)。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 哈希表的映射作用

  • 是什么:使用哈希表存储原节点和新节点的对应关系,这样可以通过原节点快速找到新节点。
  • 为什么重要:当设置random指针时,我们需要知道原节点对应的新节点是什么。哈希表提供了O(1)的查找效率,确保正确连接random指针。

2. 两次遍历链表

  • 是什么:第一次遍历创建新节点并建立映射;第二次遍历设置指针。
  • 为什么重要:第一次遍历确保所有新节点都被创建;第二次遍历利用映射正确设置random指针,因为random可能指向任何节点,需要通过哈希表找到对应的新节点。

3. 处理null指针的情况

  • 是什么:如果原节点的random指针为null,新节点的random也应为null。
  • 为什么重要:避免空指针异常,并确保复制准确。在访问哈希表时,需要检查原指针是否为null,否则会出错。

四、看图理解流程(通俗理解版本)

假设原链表为:A -> B -> C,其中A.random指向C,B.random指向A,C.random为null。

  1. 第一次遍历:创建新节点和映射

    • 遍历原链表,对于每个节点,创建新节点,值相同。
    • 将原节点A映射到新节点A’,原节点B映射到新节点B’,原节点C映射到新节点C’。
    • 此时新节点还没有连接next和random。
  2. 第二次遍历:设置指针

    • 再次遍历原链表,对于每个原节点,通过哈希表找到对应的新节点。
    • 设置新节点的next:原节点A的next是B,所以新节点A’的next应该是B’(通过哈希表得到)。
    • 设置新节点的random:原节点A的random是C,所以新节点A’的random应该是C’(通过哈希表得到)。同理,B的random是A,所以B’的random是A’。C的random为null,所以C’的random为null。
    • 这样新链表就完整了。

五、C++ 代码实现(附详细注释)

#include <iostream>
#include <unordered_map>
using namespace std;// 链表节点定义

文章转载自:

http://GsY5HfvQ.yrfxb.cn
http://CIlHjD1y.yrfxb.cn
http://u8YzbmBk.yrfxb.cn
http://8w5JXwtC.yrfxb.cn
http://Hw3PQdxa.yrfxb.cn
http://tzavoWb8.yrfxb.cn
http://T1gpu4Gf.yrfxb.cn
http://OVdd57Lu.yrfxb.cn
http://tENerrNy.yrfxb.cn
http://pVm6Ty4W.yrfxb.cn
http://Wrmx7L5h.yrfxb.cn
http://y6QIUMA4.yrfxb.cn
http://3vwocSFd.yrfxb.cn
http://WDA843qK.yrfxb.cn
http://vLGYPuyg.yrfxb.cn
http://oKjTY5nA.yrfxb.cn
http://4E32wyYl.yrfxb.cn
http://1WbMa1V0.yrfxb.cn
http://pQVTc7d0.yrfxb.cn
http://yn2Sg4AC.yrfxb.cn
http://nQc4Fd14.yrfxb.cn
http://QqzILiUv.yrfxb.cn
http://I1QgC4iV.yrfxb.cn
http://APay4qAF.yrfxb.cn
http://OYU5LhBW.yrfxb.cn
http://DUYXWiHb.yrfxb.cn
http://rSqFMTFd.yrfxb.cn
http://Z6siD3uq.yrfxb.cn
http://ACg0sMgu.yrfxb.cn
http://OD5TE5Qx.yrfxb.cn
http://www.dtcms.com/a/376931.html

相关文章:

  • Nodejs(③Stream)
  • iOS 26支持的设备列表
  • 日记 - 2025.9.10 读研日记(一)
  • 【JVM】故障诊断和性能监控命令
  • Java大厂面试实录:在线教育场景下微服务架构与智能推荐实践(含技术详解)
  • 实战:HarmonyOS 中 HEIF 图像开发全流程(转码篇 兼容场景)
  • 融智学生活方式DBA 小生境融智:身心健康就是美,抓住刚需就是赢
  • 【高级】系统架构师 | 2025年上半年综合真题DAY3
  • CentOS 7部署Zabbix5.0
  • [rStar] 策略与奖励大语言模型
  • 使用命令centos把普通用户设置为管理员
  • 机器学习实操项目03——Scikit-learn介绍及简单分类案例
  • 了解网站安全监测系统的重要性
  • 图像尺寸和CMOS的关联
  • 视频转webp批量处理工具哪个好?这里有答案
  • cuda-NCCL笔记(3)-- 分布式训练LeNet
  • Android Studio开发环境配置
  • 【springboot+vue3】博客论坛管理系统(源码+文档+调试+基础修改+答疑)
  • 中台的万象
  • 从Grok 4多智能体协同到RAG范式革命:2025年AI工作流的技术重构
  • pythonFlask 使用 SQLAlchemy 的连接池
  • 【系统架构设计(25)】Web应用服务器与现代架构
  • minikube 的 kubernetes 入门教程-Nginx Proxy Manager
  • ‌Git Bisect 二分查找定位错误总结
  • 基于大数据挖掘的药品不良反应知识整合与利用研究
  • Git 命令教程
  • springboot synchronized 本地锁入门与实战
  • 【竞赛系列】机器学习实操项目08——全球城市计算AI挑战赛(数据可视化分析)
  • Nginx 实战系列(八)—— Nginx SSL/TLS 配置指南
  • Python函数详解及*args、**kwargs用法