剑指Offer35- - 链表

1. 题目描述

这题题意感觉说的不是很清楚,容易让人产生歧义!其实题意很简单,给你一个链表 head,你深拷贝它,然后返回即可,注意不能修改原链表

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/


2. 坑

首先,这题绝对没你看上去的那么简单,复制链表?太简单了,不就是链表的创建吗?
不!本题有一个有意思的地方,就是它有一个随机指针,随机指针以为着什么?
意味着,它指向的节点,可能还未创建!
因此说,我们不能直接遍历链表,来创建新链表,需要一些特殊方法



3. 思路1 – 哈希表

O ( N ) O(N) O(N)时间, O ( N ) O(N) O(N)空间

思路呢,也很简单,既然随机指针可能指向一个还未创建的节点,那么我们就先创建它,然后通过哈希表存起来,并与原链表的相应节点做映射。
这样,当我们下次遍历到这个随机节点时,我们可以检查一下哈希表,看看是否已经建立过了,避免重复创建节点。

代码

// 本题的难点主要在于,当我们需要将指针指向某个节点时
// 随机指针指向的节点可能还不存在
class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr) return nullptr;Node *dummy = new Node(-1);Node *cur = dummy;// refto 存储的是,原链表head与它的拷贝之间的映射unordered_map<Node*, Node*> refto;while(head) { // 遍历原链表的每一个节点,创建它自己和他的random指针指向的节点// 并让它的random指针指向原链表random指针指向的节点if(refto[head] == nullptr) {Node *newNode = new Node(head->val);refto[head] = newNode;}if(head->random && refto[head->random] == nullptr) {Node *newNode = new Node(head->random->val);refto[head->random] = newNode;}refto[head]->random = refto[head->random];cur->next = refto[head];cur = refto[head];head = head->next;}return dummy->next;}
};


4. 思路2 – 原地修改

O ( N ) O(N) O(N) 时间, O ( 1 ) O(1) O(1)空间。

参考题解,最后的动图很易懂!
注意在计算空间复杂度时,是不考虑创建新链表产生的空间的,因为那是必须的,我们主要考虑的时额外空间的复杂度

大体思路,只要看了题解中的动图演示,基本就了解了,这里主要阐述一下流程:

  1. 遍历原链表,对于链表中的每个节点 n o d e node node,在它的后面新创建一个新节点 n e w N o d e newNode newNode并插入到链表当中,即 n o d e node node ➡️ n e w N o d e newNode newNode ➡️ n o d e node node-> n e x t next next,这个 n e w N o d e newNode newNode 就是对 n o d e node node 的深拷贝。(这一步就是核心所在,直接在原链表的基础上创建新链表,然后再把它分离出来,太妙了!!)
  2. 修改 n e w N o d e newNode newNode r a n d o m random random 指针。
  3. 创建新链表的头,修改 n e w N o d e newNode newNode n e x t next next

代码

class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr) return nullptr;// 原地拷贝for(Node *node = head; node != nullptr; node = node->next->next) {Node *newNode = new Node(node->val);// node -> newNode -> node.nextnewNode->next = node->next;node->next = newNode;}// 修改random指针for(Node *node = head; node != nullptr; node = node->next->next) {Node *newNode = node->next;// 判断下randodm是否存在,存在的话,才有我们的copy// 注意要指向node->random->next而不是node->random// 因为node->random->next是我们自己创建的newNode->random = (node->random != nullptr) ? node->random->next : nullptr;}// 修改next指针以分离我们创建的链表Node *newHead = head->next;for(Node *node = head; node != nullptr; node = node->next) {Node *newNode = node->next;node->next = newNode->next; // 恢复原链表的next指针// 判断下一个节点是否存在,存在的话,才有我们的copynewNode->next = (newNode->next != nullptr) ? newNode->next->next : nullptr; // 修改我们创建的链表的指针}return newHead;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 语言常用关键字详解:static、const、volatile

C 语言常用关键字详解&#xff1a;static、const、volatile 文章目录 C 语言常用关键字详解&#xff1a;static、const、volatile1. static 关键字1.1 用于局部变量示例&#xff1a; 1.2 用于全局变量示例&#xff1a; 1.3 用于函数示例&#xff1a; 2. const 关键字2.1 用于局…

Centos7本地部署阿里Qwen2-7B模型

1.从hagging face下载模型 2.把下载的模型文件&#xff0c;放到/usr/local/Qwen2-7B目录下 3.创建虚拟环境&#xff0c;安装依赖 1.环境安装 sudo yum update -y sudo yum install -y python3 python3-pip git 2.创建虚拟环境并激活 python3 -m venv qwen2_env source qwen2_…

群晖监控套件通过ONVIF协议添加海康摄像头

1. 首先登录录像机 通道管理 找到每个摄像头的IP地址 2. 登录某个摄像头 配置 3. 添加用户名&#xff08;注意不能是admin&#xff09; 设置账户密码 用户类型选管理员 4. 群晖里面添加摄像头&#xff0c;自动搜索&#xff0c;添加刚刚那个IP的摄像头 5. 验证…

【C++】 —— 笔试刷题day_8

一、求最小公倍数 题目解析 题目很简单&#xff0c;给定两个数a和b求它们的最小公倍数。 算法思路 对于求两个数的最小公倍数问题&#xff0c;想必已经非常熟悉了&#xff1b; 在之前学校上课时&#xff0c;记得老师提起过&#xff0c;最小公倍数 两个数的乘积 除以最大公约数…

MTK Android12-Android13 设置系统默认语言

Android 系统&#xff0c;默认语言 文章目录 需求&#xff1a;场景 参考资料实现方案实现思路编译脚本熟悉-平台熟悉mssi_64_cnkernel-4.19 解决方案修改文件-实现方案 源码分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定义get-default-product-locale 方法定义PRODUCT_DE…

系统如何查找文件?inode号又是什么?

下面分别详细解释您提到的三个问题&#xff1a; “文件系统怎么定位文件”、“inode 是什么”、“为什么删除后还可能被占用”。 一、文件系统怎么定位文件 1.1 目录与文件名并不直接存储文件数据 在常见的 Unix/Linux 文件系统&#xff08;如 ext4、xfs&#xff09;或类似的…

05-SpringBoot3入门-整合SpringMVC(配置静态资源、拦截器)

1、说明 在01-SpringBoot3入门-第一个项目-CSDN博客中&#xff0c;其实就已经整合了SpringMVC。下面讲解怎么配置静态资源和拦截器 2、配置静态资源 命名&#xff1a;static&#xff08;文件夹&#xff09; 位置&#xff1a;src/main/resources 编写一个html文件 访问 http:/…

Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测

聚划算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测 目录 聚划算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 聚划算&#xff01;Tran…

树莓派浏览器配置全解析:从轻量系统到网页应用平台

树莓派&#xff08;Raspberry Pi&#xff09;不仅是嵌入式开发的入门利器&#xff0c;也因其低成本和强大的社区支持而成为物联网、数字标牌、教育培训等领域的热门平台。在很多应用中&#xff0c;运行一个浏览器并作为 Web 前端展示、操作或交互的能力显得尤为关键。 但在资源…

初识Qt(一)

本文部分ppt、视频截图原链接&#xff1a;萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频 1. Qt是什么&#xff1f; Qt是一个跨平台的C应用程序开发框架&#xff0c;它既为图形用户界面(GUI)程序开发提供了强大支持&#xff0c;也能用于开发非GUI的控制台程序、服务端…

六十天前端强化训练之第三十二天之Babel 转译配置大师级深度讲解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念与知识体系详解 1. Babel 工作原理全景解析 二、完整配置方案&#xff08;带详细注释&#xff09; 1. 进阶版 .babelrc 配置 2. Webpack 集成配置&#xff08…

智能提示词生成器:助力测试工程师快速设计高质量测试用例

在软件测试中,测试用例设计方法的选择和实施是确保软件质量的重要步骤。测试工程师经常需要根据不同的测试场景、参数维度和业务需求,设计出覆盖率高且有效的测试用例。然而,设计测试用例并非易事,特别是在面对复杂的业务逻辑时。 为了帮助测试工程师高效生成测试用例提示…

beanie.exceptions.CollectionWasNotInitialized

遇到这样的情况不要慌&#xff0c;不要慌 1&#xff1a;检查模型是否已经初始化&#xff1a; class TaskModel(Document):"""定时任务模型"""task_id: str Field(default_factorylambda: str(uuid.uuid4()), # 新增默认值description"任…

【CVE-2025-30208】| Vite-漏洞分析与复现

漏洞简介 CVE-2025-30208 是 Vite 开发服务器中的一个任意文件读取漏洞。该漏洞允许攻击者通过特定的 URL 参数绕过访问控制&#xff0c;从而读取服务器上的敏感文件&#xff08;如 /etc/passwd 或 C:\windows\win.ini&#xff09;。 该漏洞主要影响以下版本的 Vite&#xff…

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中&#xff0c;我们经常使用 Markdown 来记录表格数据。然而&#xff0c;Markdown 格式的表格在实际应用中不如 Excel 方便&#xff0c;特别是需要进一步处理数据时。因此&#xff0c;我们开发了一个使用 wxPython 的 GUI 工具&#xff0c;将 Markdown…

Golang使用 ip2region 查询IP的地区信息

利用 ip2region 进行 IP 地址定位 import ("fmt""log""github.com/lionsoul2014/ip2region/binding/golang/xdb" )func main() {ip : "213.118.179.98"dbPath : ".\\cmd\\ip\\ip2region.xdb"// 1、初始化查询器//searcher,…

对匿名认证的理解

概述&#xff1a;在 Spring Security 中&#xff0c;** 匿名认证&#xff08;Anonymous Authentication&#xff09;** 是一种特殊的认证机制&#xff0c;用于处理未提供有效凭证的请求。 匿名认证的本质 目的&#xff1a;允许未认证用户访问特定资源。原理&#xff1a; 当请求…

C++调用Python

Python安装 地址&#xff1a; python官网 可以根据需要下载对应的版本。 调用python python测试脚本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例计算逻辑if __name__ "__main__":# 从命令行参数读取 JSON 字符串try…

工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐

一、什么是工程数字建造管理系统平台&#xff1f; 工程数字建造管理系统平台是一种集成了先进信息技术&#xff08;如云计算、大数据、物联网等&#xff09;的综合性管理工具&#xff0c;它旨在通过数字化手段提升工程建造全过程的管理效率和决策水平。这一平台不仅覆盖了工程…

Android开发EmojiCompat 初始化

Android开发EmojiCompat 初始化 报错信息&#xff1a; ensure spannable:java.lang.IllegalStateException: EmojiCompat is not initialized 在Application上写上下面代码即可&#xff1a; EmojiCompat.Config config new BundledEmojiCompatConfig(this);EmojiCompat.in…