【LeetCode刷题指南】--随机链表的复制

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。  

前言: 随着编程相关知识点的学习,我们LeetCode的刷题也不能落下。在前面我们也接触到了洛谷和牛客这两个刷题网站,但是博主一直都在推荐大家使用力扣,是因为力扣的判题严谨且大部分都是接口型题目,与面试中的笔试题也更加贴合。那么还是老样子,博主会为大家提供我自己的思路和代码,但是算法题的解法肯定不止一个,欢迎大家一起交流和讨论。


目录

链表的随机复制

解题过程:

代码演示:


链表的随机复制

题目链接:138. 随机链表的复制 - 力扣(LeetCode)

题目描述: 

题目示例: 

思路:在原链表基础上拷贝节点,置random指针,断开新旧链表

解题过程:

1.我们首先需要了解一下什么是浅拷贝什么是深拷贝


浅拷贝(Shallow Copy):

• 定义:仅复制变量本身的值,对于指针类型的成员,只复制指针的地址,而不复制指针所指向的内存内容。

• 特点:

◦ 拷贝后,原变量和新变量中的指针指向同一块内存空间。

◦ 实现简单,通常通过直接赋值(如=运算符)或memcpy等函数完成。

◦ 风险:当其中一个指针释放内存后,另一个指针会变成野指针,再次操作可能导致内存错误(如重复释放、访问已释放内存)。

深拷贝(Deep Copy):

• 定义:不仅复制变量本身的值,对于指针类型的成员,会先为新变量的指针分配新的内存空间,再将原指针指向的内容复制到新内存中。

• 特点:

◦ 拷贝后,原变量和新变量中的指针指向各自独立的内存空间,两者互不影响。

◦ 需要手动实现,通常通过自定义函数完成(需显式分配内存并复制内容)。

◦ 安全性高,避免了浅拷贝的内存冲突问题,但实现相对复杂,且会额外消耗内存。

2. 在原链表的基础上拷贝节点

3.置random指针 

一定要记住:copy->random=pcur->random->next

4.断开新旧链表 

时间复杂度:O(N)

代码演示:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/
typedef struct Node Node;
Node* BuyNode(int x)
{Node*newnode=(Node*)malloc(sizeof(Node));newnode->val=x;newnode->next=newnode->random=NULL;return newnode;
}
void InsertaList(Node*head)
{Node*pcur=head;while(pcur){Node*newnode=BuyNode(pcur->val);Node*next=pcur->next;pcur->next=newnode;newnode->next=next;pcur=next;}
}
void SetRandom(Node*head)
{Node*pcur=head;while(pcur){Node*copy=pcur->next;if(pcur->random)copy->random=pcur->random->next;pcur=copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}//拷贝原链表的节点并插入原链表中InsertaList(head);//设置randomSetRandom(head);//断开新的链表Node*pcur=head;Node*copyhead,*copytail;copyhead=copytail=pcur->next;while(copytail->next){pcur=copytail->next;copytail->next=pcur->next;copytail=copytail->next;}return copyhead;
}

 

这里需要特别注意一下,如果为空特殊处理,不然运行会有问题


往期回顾: 

【数据结构初阶】--双向链表(一)

【数据结构初阶】--双向链表(二)

结语:本篇文章就到此结束了,《LetetCode刷题指南》中的题目比起之间的C语言刷题集中的题目,肯定会更加复杂一些。而且题目形式也不一样,大家需要注意一下。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持

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

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

相关文章

系统学习算法:专题十四 链表

前提知识:1.画图,数据结构相关的题,画图必不可少,只要能画出来,那么后面的代码就很容易能写出来,因为将抽象的数据结构转换为直观的图画2.引入虚拟头结点,也叫哨兵位,能够避免考虑很…

零基础学后端-PHP语言(第一期-PHP环境配置)

从本期开始,我们学习PHP,但是我们要先配置PHP环境 PHP官网链接:PHP For Windows: Binaries and sources Releases 我们可以看到有以下资源 可以看到有很多php的版本,有Non Thread Safe和Thread Safe,还有zip&#xf…

C++ primer知识点总结

《C Primer》系统学习指南:从C到C的平滑过渡根据你提供的《C Primer》目录和你的需求(C语言背景转C,侧重网络编程),我将为你制定一个全面的学习计划,包含知识点详解、C/C对比、实战案例和分阶段项目练习。第…

异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界

当全球数据量以每两年翻一番的速度爆炸式增长,高性能计算(HPC)与复杂场景分析正成为破解气候预测、基因测序、金融风控等世界级难题的关键引擎。但异构计算环境的碎片化、多系统协同的复杂性、数据流动的安全风险,正在形成制约行业…

【华为机试】240. 搜索二维矩阵 II

文章目录240. 搜索二维矩阵 II描述示例 1示例 2提示解题思路核心分析问题转化算法实现方法1:右上角开始搜索(推荐)方法2:逐行二分查找方法3:分治法方法4:左下角开始搜索复杂度分析核心要点数学证明右上角搜…

疯狂星期四文案网第16天运营日记

网站运营第16天,点击观站: 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨日30多ip, 今天也差不多,同步上周下降了一些,感觉明天疯狂星期四要少很多了,记得上周四700多ip&…

Linux系统基础入门与配置指南

Linux基本概述与配置 一、我们为什么使用Linux(Linux的优点)开源与自由 免费: 无需支付许可费用,任何人都可以自由下载、安装和使用。源代码开放: 任何人都可以查看、修改和分发源代码。这带来了极高的透明度、安全性和…

如何删除VSCode Marketplace中的publisher

网页上并没有提供删除的按钮,需要通过命令的形式删除。 vsce delete-publisher [要删除的名字]# 键入token # y 确认这里的token是之前在Azure DevOps中创建的token,忘了的话可以重建一个 刷新网页看一下 成功删除了。

Windows安装git教程(图文版)

Git 是一个分布式版本控制系统,用于跟踪文件的变化,特别是在软件开发中。它使得多个开发者可以在不同的机器上并行工作,然后将他们的改动合并在一起。是在开发过程中,经常会用到的一个工具。本章教程,主要介绍Windows上…

Remote Framebuffer Protocol (RFB) 详解

RFC 6143 规范文档:The Remote Framebuffer Protocol 文章目录1. 引言2. 初始连接流程2.1 TCP连接建立2.2 协议版本协商2.3 安全握手3. 显示协议机制3.1 核心概念3.2 像素格式4. 输入协议4.1 键盘事件(KeyEvent)4.2 鼠标事件(PointerEvent)5. 协议消息详解5.1 握手消…

从 DeepSeek-V3 到 Kimi K2:八种现代大语言模型架构设计

编译:青稞社区Kimi 原文:https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison 首发:https://mp.weixin.qq.com/s/lSM2jk1UxJVz1WllWYQ4aQ 自原始 GPT 架构开发以来已经过去了七年。乍一看,从 2019 年的…

linux驱动开发笔记--GPIO驱动开发

目录 前言 一、设备树配置 二、驱动编写 三、用户空间测试 总结 前言 开发平台:全志A133,开发环境:linux4.9andrio10,开发板:HelperBoard A133_V2.5。 一、设备树配置 打开板级设备树配置文件,路径&a…

腾讯iOA:企业软件合规与安全的免费守护者

人们眼中的天才之所以卓越非凡,并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 目录 一、为什么要使用腾讯iOA? 二、中小企业软件合规痛点 三、腾讯iOA解决方案 3.1 核心技…

C#定时任务实战指南:从基础Timer到Hangfire高级应用

高效管理后台作业,让定时任务成为应用的可靠引擎 在C#应用开发中,定时任务是实现数据同步、报表生成、系统维护等后台作业的核心技术。本文将深入探讨C#生态中主流的定时任务解决方案,从基础的内置Timer到强大的Quartz.NET和Hangfire框架&…

软件开发、项目开发基本步骤

• 立项阶段:项目定义、需求收集与分析、可行性分析、风险评估与规划、项目团队组建、制定项目计划、获取批准与支持。• 需求评审与分析:◦ 项目团队(包括产品经理、开发人员、测试人员等)共同参与,明确项目的目标、功…

慢 SQL接口性能优化实战

在对某电商项目进行接口性能压测时,发现 /product/search 接口响应缓慢,存在明显性能瓶颈。通过慢查询日志排查和 SQL 优化,最终实现了接口响应速度的显著提升。本文完整还原此次优化过程,特别强调操作步骤和问题分析过程&#xf…

【C#】在WinForms中实现控件跨TabPage共享的优雅方案

文章目录一、问题背景二、基本实现方案1. 通过修改Parent属性实现控件移动三、进阶优化方案1. 创建控件共享管理类2. 使用用户控件封装共享内容四、方案对比与选择建议五、最佳实践建议六、完整示例代码一、问题背景 在Windows窗体应用程序开发中,我们经常遇到需要…

Android Camera openCamera

由头 今日调休,终于终于闲下来了,可以写一下博客了,刚好打开自己电脑,就有四年前下的谷歌Android 12源码,不是很旧,刚好够用,不用再另外下载新源码了,不得不感慨这时间过得真快啊~废…

神经网络——池化层

目录 池化层 最大池化层 MaxPool2d 最大池化操作图示 最大池化操作代码演示 综合代码案例 池化层 池化层(Pooling Layer) 核心作用:通过降采样减少特征图尺寸,降低计算量,增强特征鲁棒性。 1. 常见类型 …

Android 默认图库播放视频没有自动循环功能,如何添加2

Android 默认图库播放视频没有自动循环功能, 如何添加 按如下方式修改可以添加 开发云 - 一站式云服务平台 --- a/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java +++ b/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java…