OJ随机链表的复制题目分析

题目内容:

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

分析: 

这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析吧!

1.题目要求的是链表的复制,那么我们得想我们该怎么做,才能很好地进行下去呢?

2.是直接把原链表一个一个地移动过来?这思路果断不对,它还要保持原来的链表不被复制啊.

3.经过观察,我们发现13的random指向7。各种穿插的,所以我们采用

 

//复制struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;struct Node*Next=cur->next;cur->next=copy;copy->next=Next;cur=Next;}

复制部分:

先在每个数复制下来,分别放在它的原数字的下一个。即下图:

4.接着你看它原链表的那些数字。7的random指向NULL,13的random指向7.(其他的省略说)。7的next指向13。看到这种规律,我们试想是不是可以把复制的也弄成这样子,就形成了一个独立的复制链表了,对吧? 

连线部分:

 

 //连接线cur=head;while(cur){struct Node* copy=cur->next;// struct Node* Next=cur->next->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}

如下图:

你看复制完了之后,是不是可以直接它复制那部分挪下来,它也是不会破坏原链表的,这是不是就符合题目要求了对吧?

5.完成了这步了之后,到了我们一个一个挪的那部分了。

如下图:

 

解释上图:

 //复制的挪下来,恢复原链表struct Node* copyhead=NULL,*copytail=NULL;cur=head; while(cur){struct Node* copy=cur->next;struct Node* Next=copy->next; //尾插if(copyhead==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}

挪动部分:

当我们复制完了之后,开始挪新的复制链表:

1.首先定义一个cur指针指向head头。再定义一个next指针指向cur的下一个(方便它随时都能返回找到copy的位置)。

2.定义两个指针分别为copyhead和copytail指针,放在新的链表那里当作移动工具和最后返回工具

2.接着,相当于进行尾插,当 第一次时,copyhead和copytail都为空时,就把copy值直接放到这个指针

3.不为空时,就把copy值放到copytail的下一位。

恢复部分:

最后,恢复原来的链表,即去掉它copy的那些数:

1.因为我们上面都没有动过cur的位置,所以这里就直接使用cur这个指针就行了。

2.把cur的下一个给Next即:  把cur的下一个next给给cur的next的next(即cur的下下个)。

  //恢复链表cur->next=Next;cur=Next; 

总代码: 

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) {//复制struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;struct Node*Next=cur->next;cur->next=copy;copy->next=Next;cur=Next;}//连接线cur=head;while(cur){struct Node* copy=cur->next;// struct Node* Next=cur->next->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}//复制的挪下来,恢复原链表struct Node* copyhead=NULL,*copytail=NULL;cur=head; while(cur){struct Node* copy=cur->next;struct Node* Next=copy->next; //尾插if(copyhead==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}//恢复链表cur->next=Next;cur=Next; }return copyhead;
}

最后,特别要注意的是:cur的位置要每到一部分都要及时更新变成head。(因为它每一部分都在改变),不然就会像我一开始那样,发现怎么都不正确哇哇哇哇。

每次鸡汤:

好啦,到了我们的每次鸡汤部分:

虽然我每次迈出的那一步都很小,但是终究会有那么一天会到达终点的。加油吧,青年。

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

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

相关文章

uc/os-II 原理及应用(一) 嵌入式实时系统基本概念

基于嵌入式实时操作系统μCOS-II原理及应用(第2版)-任哲 自行网上寻找资源。 计算机系统的中分为计算机硬件系统与计算机软件系统,计算机软件系统由上到下分为,应用软件,系统软件,操作系统;操作系统一般在计算机软件的最低层&…

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…

数据库知识汇总2

一. 范式 定义:范式是符合某一种级别的关系模式的集合。 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式; 一个低一级范式的关系模式,通过模式分解(schema decomposition)可以转换为若干个高一…

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一种针对 Transformer 模型中注意力机制的优化实现,旨在提高计算效率和内存利用率。随着大模型的普及,Flash Attention V3 在 H100 GPU 上实现了显著的性能提升,相比于前一版本,V3 通…

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

Ubuntu22.04双系统安装记录

1.Ubuntu24.04在手动分区时&#xff0c;没有efi选项&#xff0c;需要点击分区界面左下角&#xff0c;选择efi的位置&#xff0c;然后会自动创建/boot/efi分区&#xff0c;改到2GB大小即可。 2.更新Nvidia驱动后&#xff0c;重启电脑wifi消失&#xff0c;参考二选一&#xff1a…

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理环境&#xff0c;不需要科学上网(价格便宜、有安全风险&#…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

【Rust自学】10.2. 泛型

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#xf…

Spark-Streaming有状态计算

一、上下文 《Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量&#xff0c;那么如何才能统计从开始加载数据到当下的所有数量呢&#xff1f;下面我们就来通过官方例子学习下Spark-Streaming有状态计算。 二、官方例子 所属包&#xff1a;org.…

Python 3 输入与输出指南

文章目录 1. 输入与 input()示例&#xff1a;提示&#xff1a; 2. 输出与 print()基本用法&#xff1a;格式化输出&#xff1a;使用 f-string&#xff08;推荐&#xff09;&#xff1a;使用 str.format()&#xff1a;使用占位符&#xff1a; print() 的关键参数&#xff1a; 3.…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奋斗&#xff01; Less-1 尝试添加’注入&#xff0c;发现报错 这里我们就可以直接发现报错的地方&#xff0c;直接将后面注释&#xff0c;然后使用 1’ order by 3%23 //得到列数为3 //这里用-1是为了查询一个不存在的id,好让第一…

时间序列预测算法---LSTM

目录 一、前言1.1、深度学习时间序列一般是几维数据&#xff1f;每个维度的名字是什么&#xff1f;通常代表什么含义&#xff1f;1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路&#xff1f;1.4、RNN存在哪些问题? 二、…

leetcode题目(3)

目录 1.加一 2.二进制求和 3.x的平方根 4.爬楼梯 5.颜色分类 6.二叉树的中序遍历 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

快速上手LangChain(三)构建检索增强生成(RAG)应用

文章目录 快速上手LangChain(三)构建检索增强生成(RAG)应用概述索引阿里嵌入模型 Embedding检索和生成RAG应用(demo:根据我的博客主页,分析一下我的技术栈)快速上手LangChain(三)构建检索增强生成(RAG)应用 langchain官方文档:https://python.langchain.ac.cn/do…

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…

【Windows】powershell 设置执行策略(Execution Policy)禁止了脚本的运行

报错信息&#xff1a; 无法加载文件 C:\Users\11726\Documents\WindowsPowerShell\profile.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参 阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符…

可编辑37页PPT |“数据湖”构建汽车集团数据中台

荐言分享&#xff1a;随着汽车行业智能化、网联化的快速发展&#xff0c;数据已成为车企经营决策、优化生产、整合供应链的核心资源。为了在激烈的市场竞争中占据先机&#xff0c;汽车集团亟需构建一个高效、可扩展的数据管理平台&#xff0c;以实现对海量数据的收集、存储、处…

【快速实践】类激活图(CAM,class activation map)可视化

类激活图可视化&#xff1a;有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策 对输入图像生成类激活热力图类激活热力图是与特定输出类别相关的二维分数网格&#xff1a;对任何输入图像的每个位置都要进行计算&#xff0c;它表示每个位置对该类别的重要程度 我…