news 2026/5/9 23:31:09

链表掌握九成?这题能独立完成吗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表掌握九成?这题能独立完成吗

若能独立完成本题的思路构建与代码实现,说明你对链表的理解已掌握九成。建议先自行尝试解题(题目链接见下图),以检验掌握程度。若遇到困难,可参考本文提供的详细思路解析和代码实现(采用C语言)。

随机链表的复制

链接:https://leetcode.cn/problems/copy-list-with-random-pointer

本题难点在于如何拷贝randon,怎样才能找到拷贝链表和原链表的关联。

解题思路:

此题可以分三步进行:

1.拷贝链表的每一个节点,拷贝的节点先链接到被拷贝节点的后面

节点复制阶段遍历原始链表,为每个节点创建拷贝节点,将拷贝节点插入到原始节点之后。例如原始链表为A->B->C,复制后变为A->A'->B->B'->C->C'。这样我们就将拷贝链表和原链表关联起来,对我们后续找链表里的数据至关重要。

2.复制随机指针的链接:拷贝节点的随机指针指向被拷贝节点随机指针的下一个位置

随机指针设置阶段再次遍历链表,处理每个拷贝节点的random指针。由于第一步我们将拷贝节点和原连接起来,变成A->A'->B->B'->C->C'。由图我们可以看出节点原始节点的random指针指向的节点的下一个节点即为拷贝节点应该指向的位置。若原始节点的random为NULL,拷贝节点的random也设为NULL。

3.拆解链表,把拷贝的链表从原链表中拆解出来

链表拆分阶段创建拷贝链表的头指针和尾指针,通过遍历将拷贝节点从交错链表中提取出来,同时恢复原始链表的连接关系。每次处理将拷贝节点接入拷贝链表尾部,并移动原始链表的当前指针。最终返回副本链表的头节点。

该算法时间复杂度为O(n),空间复杂度为O(1)(不计入返回的深拷贝链表所需空间),通过巧妙地利用节点交错排列避免了哈希表的额外空间开销。

代码实现:

struct Node* copyRandomList(struct Node* head) { /* 解题步骤: 1. 为每个节点创建副本,插入到原节点之后 2. 设置副本节点的random指针 3. 分离原链表和副本链表 */ struct Node* cur = head; // 第一步:创建并插入副本节点 while(cur) { struct Node* copy = (struct Node*)malloc(sizeof(struct Node)); copy->val = cur->val; copy->next = cur->next; cur->next = copy; cur = copy->next; } // 第二步:设置副本节点的random指针 cur = head; while(cur) { struct Node* copy = cur->next; copy->random = cur->random ? cur->random->next : NULL; cur = copy->next; } // 第三步:分离两个链表 cur = head; struct Node* copyhead = NULL, *copytail = NULL; while(cur) { struct Node* copy = cur->next; cur->next = copy->next; if(!copytail) { copyhead = copytail = copy; } else { copytail->next = copy; copytail = copy; } cur = cur->next; } return copyhead; }

如果对你有帮助别忘了一键三连,制作不易谢谢支持!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 21:57:55

利用DDU清除NVIDIA驱动残留的实践指南

显卡驱动“清道夫”:如何用 DDU 彻底清除 NVIDIA 驱动残留 你有没有遇到过这种情况——明明下载了最新版的 NVIDIA 驱动,安装时却卡在 0%,或者刚装完重启后屏幕黑屏、分辨率异常?更离谱的是,系统居然还识别出一张你早就…

作者头像 李华
网站建设 2026/5/8 5:27:54

飞书文档批量导出神器:一行命令搞定700份文档迁移的完整指南

飞书文档批量导出神器:一行命令搞定700份文档迁移的完整指南 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 还在为飞书文档迁移而烦恼吗?feishu-doc-export这款跨平台工具能让你用一行命令…

作者头像 李华
网站建设 2026/5/5 3:20:57

终极指南:完全掌握ncmdump网易云音乐解密工具

终极指南:完全掌握ncmdump网易云音乐解密工具 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump ncmdump是一款专业的网易云音乐NCM格式解密工具,能够将加密的NCM文件转换为标准的M…

作者头像 李华
网站建设 2026/5/9 5:03:40

算法的五大核心特征

目录 前言 一、有穷性:算法的时间与步骤边界 1.1 核心定义 1.2 关键细节 1.3 反例与实践注意 二、确定性:每一步的唯一可能性 2.1 核心定义 2.2 关键细节 2.3 反例与实践注意 三、可行性:步骤的可执行性 3.1 核心定义 3.2 关键细…

作者头像 李华
网站建设 2026/5/10 11:58:16

Taro跨端开发实战:核心原理与关键差异解析

Taro 框架学习全指南:核心原理、关键差异与迁移成本详解 随着小程序生态的不断扩大,“一次开发,多端运行”逐渐成为前端工程化的重要方向。Taro 作为京东开源的多端统一开发框架,已经成为跨端开发的事实标准之一。 但需要明确的…

作者头像 李华