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

【LeetCode数据结构】随机链表的复制

🔥个人主页:胡萝卜3.0

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

📖个人专栏:  《C语言》、《数据结构》 、《C++干货分享》、LeetCode&牛客代码强化刷题

⭐️人生格言:不试试怎么知道自己行不行

目录

随机链表的复制问题

1、题目描述和示例

2、思路

3、解题过程

4、改进措施


随机链表的复制问题

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

1、题目描述和示例

2、思路

我们的思路是:

1、在原链表的基础上拷贝结点

2、设置random指针 

3、断开新旧链表

我们先来看一下题目描述——

嗯?什么是深拷贝?

看下图:

所谓的深拷贝就是重新向系统申请一个空间,然后用此空间对pcur中的值进行拷贝,地址不同

有了深拷贝,还有浅拷贝

浅拷贝:值的拷贝,不需要重新申请空间,地址相同

3、解题过程

在做算法题的时候,画图是很重要的

如下图所示—— 

random如何设置? 

4、改进措施

既然我们创建一个新链表,并在新链表中设置random指针很麻烦,那我们可以在原链表中操作

1.在原链表的基础上拷贝结点

2.设置random指针

3.断开新旧链表

变成这样——

ok,我们将上面的思路用代码来试一下:

 typedef struct Node Node;//申请结点空间Node* BuyNode(int num){Node* newnode=(Node*)malloc(sizeof(Node));newnode->val=num;newnode->next=NULL;newnode->random=NULL;return newnode;}
void AddNode(Node* head)
{Node* pcur=head;//遍历链表,拷贝结点while(pcur){Node* newnode=BuyNode(pcur->val);Node* next=pcur->next;newnode->next=next;pcur->next=newnode;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) {//在原链表中进行结点的拷贝并插入到结点的后面AddNode(head);//设置random指针setRandom(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;
}

运行一下:

出现了对空指针的报错~~~那就说明在该代码中存在对空指针的使用

改进代码:

 typedef struct Node Node;//申请结点空间Node* BuyNode(int num){Node* newnode=(Node*)malloc(sizeof(Node));newnode->val=num;newnode->next=NULL;newnode->random=NULL;return newnode;}
void AddNode(Node* head)
{Node* pcur=head;//遍历链表,拷贝结点while(pcur){Node* newnode=BuyNode(pcur->val);Node* next=pcur->next;newnode->next=next;pcur->next=newnode;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;}//在原链表中进行结点的拷贝并插入到结点的后面AddNode(head);//设置random指针setRandom(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;
}

ok,通过上面的操作,我们就可以完成这道算法题啦!!!

http://www.dtcms.com/a/366628.html

相关文章:

  • 01 神经网络简介
  • 2025国赛C题题目及最新思路公布!
  • 代码随想录二刷之“贪心算法”~GO
  • 【笔记】Software Engineering at Google
  • 25年Docker镜像无法下载的四种对策
  • 国产GEO工具哪家强?巨推集团、SEO研究协会网、业界科技三强对比
  • 如何监控员工的电脑?7款实用的员工电脑管理软件,探索高效管理捷径!
  • Spring Cloud Eureka 核心原理
  • Spring简单的读取和存储对象
  • Axure RP 9 Mac 交互原型设计
  • Ubuntu 25.04搭建hadoop3.4.1集群详细教程
  • SpringBoot 网络流量抓包与分析系统
  • DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标
  • 【数据可视化-108】2025年6月新能源汽车零售销量TOP10车企分析大屏(PyEcharts炫酷黑色主题可视化)
  • C#强制类型转换(显示转换)和安全类型转换
  • 激光频率梳 3D 轮廓测量 - 莫尔条纹光的工作原理及优缺点
  • 2025变现打法:AI+IP实现高效变现|创客匠人
  • Mysql杂志(九)
  • Agent Prompt工程:如何让智能体更“听话”?(实践指南)
  • 深度学习玩游戏, 模型玩游戏,大模型+游戏 llm+game, 机器学习玩游戏,人工智能游戏陪伴,模型陪玩游戏
  • 机器学习基础-day02-K近邻算法
  • 大数据框架Doris全面解析
  • 学习机器学习能看哪些书籍
  • 计算机毕业设计:基于Python的影评情感分析可视化推荐系统
  • 【嵌入式DIY实例-ESP32篇】-倾斜弹跳球游戏
  • 【CouponHub项目开发】使用RocketMQ5.x实现延时修改优惠券状态,并通过使用模板方法模式重构消息队列发送功能
  • Unity中,软遮罩SoftMaskForUGUI可移动遮罩形状实现方法
  • 阻抗、瞬时阻抗、特性阻抗的区别
  • AI重构出海营销:HeadAI如何用“滴滴模式”破解红人营销效率困局?
  • 元宇宙与教育变革:沉浸式学习重构知识获取与能力培养