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

【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.dtcms.com/a/294834.html

相关文章:

  • 腾讯云直播产品优势
  • 自研支架系统:打造Franka双臂协作机器人一体化新方案
  • 详述消息队列kafka
  • 嵌入式开发学习———Linux环境下数据结构学习(二)
  • MYSQL 笔记3
  • vscode怎么安装MINGW
  • Https以及CA证书
  • VUE接口任务轮询查询任务封装hooks
  • 免费的远程电脑控制软件
  • 银河麒麟v10 更换linux内核(降内核版本5.15->5.4)
  • kanzi3.6.10 窗口插件-网页生成界面
  • istio-proxy用哪个端口代理http流量的?
  • 百度文心大模型ERNIE全面解析
  • 绿地集团携手深兰科技推动AI医诊大模型快速落地
  • AI产品经理面试宝典第48天:产品设计与用户体验优化策略
  • 从零解析DeepSeek Excel公式生成器的深度学习实现原理
  • Mybatis_1
  • Spring Bean初始化及@PostConstruc执行顺序
  • 零侵入加解密方案:Spring Boot + Jasypt + AOP实现敏感数据自动保护
  • Leetcode力扣解题记录--第54题(矩阵螺旋)
  • 表征工程中哪里用到内积 :内积vs余弦相似度--谁更胜一筹?
  • 智慧农业平台-农资农服农业数字化转型
  • 算法第三十七天:动态规划part05(第九章)
  • Golang各版本特性
  • 算法:数组part01:704. 二分查找 +977.有序数组的平方
  • ZeroMQ源码深度解析:高性能网络库的架构设计与性能优化
  • 高效编程革命:DeepSeek V3多语言支持与性能优化实战
  • 【前端】当前主流的 CSS 预处理器语言Sass / SCSS、Less、Stylus
  • C++:list(1)list的使用
  • HomeAssistant本地开发笔记