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

随机链表的复制问题详解与代码实现

一、问题描述

138. 随机链表的复制 - 力扣(LeetCode)

题目要求对一个带有随机指针(random)的链表进行深拷贝。深拷贝的规则是:

  • 新建与原链表长度相同的全新节点,值与原节点对应相同。
  • 新节点的nextrandom指针需指向复制链表中的新节点,且指针指向关系与原链表完全一致,不能指向原链表节点。

输入为原链表头节点,输出为复制链表的头节点。示例输入输出如下:

  • 示例 1
    • 输入:[[7,null], [13,0], [11,4], [10,2], [1,0]]
    • 输出:[[7,null], [13,0], [11,4], [10,2],[1,0]]

二、代码实现与详解

(一)链表节点定义

struct Node {int val;struct Node *next;struct Node *random;
};

(二)在原链表每个节点后插入copy

Node* cur = head;while(cur){Node* copy = (Node*)malloc(sizeof(Node));if(copy == NULL){perror("malloc fail!");exit(1);}copy->val = cur->val;copy->next = cur->next;cur->next = copy;cur = copy->next;}

(三)控制random

 cur = head;while(cur){Node* copy = cur->next;if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;}cur = copy->next;}

(四)尾插连接copy,恢复原链表

Node* copyhead = NULL, *copytail = NULL;cur = head;while(cur){Node* copy = cur->next;Node* next = copy->next;if(copytail == NULL){copyhead = copytail = copy;}else{copytail->next = copy;copytail = copytail->next;}cur->next = next;cur = next;}return copyhead;

三、扩展思考

高效解法:哈希表映射法

核心思想

通过哈希表建立原节点与新节点的一一映射关系,确保在复制过程中能快速找到对应新节点,从而正确设置random指针。

步骤分解
  1. 第一次遍历:创建新节点并建立映射
    遍历原链表,为每个原节点创建对应的新节点,将原节点作为键、新节点作为值存入哈希表。

  2. 第二次遍历:设置新节点的nextrandom指针
    再次遍历原链表,通过哈希表获取当前原节点对应的新节点,以及原节点nextrandom指向的原节点对应的新节点,完成指针赋值。

四、总结

随机链表的复制问题核心在于处理random指针的跨节点引用,哈希表映射法通过建立原节点与新节点的直接关联,简洁高效地解决了这一问题。在实际开发中,需根据编程语言特性选择合适的数据结构,并注意内存管理(如 C 语言的动态内存分配与释放)。通过两次遍历和哈希表映射,可确保深拷贝的正确性和完整性。

http://www.xdnf.cn/news/597727.html

相关文章:

  • python学习打卡day33
  • 等离子体隐身技术和小型等离子体防御装置设计
  • 军事目标系列之迷彩作战人员检测数据集VOC+YOLO格式2755张1类别
  • C#中WSDL文件引用问题
  • 【接近平均分配箱子数量】2022-1-23
  • uni 常用api
  • 学习STC51单片机11(芯片为STC89C52RC)
  • 嵌入式软件架构规范之 - 分层设计
  • Linux终端输入有80个字符的限制处理
  • 【com.unity3d.player.UnityPlayer介绍】
  • Spring IoC 和 AOP -- 核心原理与高频面试题解析
  • 单测覆盖率和通过率的稳定性问题,以及POM文件依赖包版本一致性的挑战
  • 位运算及其算法
  • 解决wsl没代理的问题
  • 第4周_作业题_逐步构建你的深度神经网络
  • 论文解读 | 《药用真菌桑黄通过内质网应激 - 线粒体损伤诱导人宫颈癌细胞凋亡》
  • 从JDK 17到JDK 21:Java核心特性概述
  • Python之web错误处理与异常捕获
  • 【人工智能】从零到一:大模型应用开发的奇幻旅程
  • 【修改提问代码-筹款】2022-1-29
  • Qwen2.5-VL技术解读和文档解析可行性验证
  • Any类(C++17类型擦除,也称上帝类)
  • ORA-00313 ORA-00312 ORA-27037 redo被删除后重建
  • 如何顺利地将应用程序从 Android 转移到Android
  • SpringCloud (3) 配置中心
  • vue项目的dist在nginx部署后报错Uncaught SyntaxError
  • 技术篇-2.2.JAVA应用场景及开发工具安装
  • Spring Boot 注解 @ConditionalOnMissingBean是什么
  • 嵌入式开发学习日志(linux系统编程--io文件偏移函数(3)和目录)Day26
  • 文件IO操作、目录操作