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

leetcode:138. 随机链表的复制

一、题目:

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

 

函数原型:

struct Node* copyRandomList(struct Node* head)

二、思路

本题是给出一个单链表,单链表的每个结点还额外有一个随机指针,随机指向其他结点,要求复制该链表。

常规情况下复制链表,只需要遍历原链表,新建和原链表相同的结点尾插到新链表即可。

但是该链表有一个随机指针,还需要找到原链表中各个结点随机指针的指向,让新链表中结点的随机指针也指向新链表中的与原链表中相同位置的结点。因此还要在新链表中找到原链表中各个结点随机指针指向的结点,算法为O(N^2),且判断是否为随机指针指向的结点只能通过结点值判断,如果链表中有多个值相同的结点,九不便于判断是否为随机指针指向的结点。

 

上述方法不易实现,此处提供一个全新的思路:

由于新建一个链表每个结点的随机指针不好复制,那么就在原链表上复制每个结点,然后再复制每个结点的随机指针。

先在原链表每个结点后复制一个相同的结点,复制完成后,再次遍历链表,就可以通过当前结点随机指针指向结点的下一个结点找到复制结点随机指针需要指向的结点。最后将每个复制的结点从原链表中拆下来,重新链接组成新的链表即可完成链表的复制。

三、代码

/*** 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;copy->next=cur->next;cur->next=copy;cur=cur->next->next;}cur=head;while(cur){//复制结点的随机指针指向的结点就是当前结点随机指针指向结点的下一结点if(cur->random)cur->next->random=cur->random->next;elsecur->next->random=NULL;cur=cur->next->next;}cur=head;struct Node* newhead=NULL;struct Node *tail=NULL;while(cur)//拆下复制的结点并恢复原链表,重新链接这些结点{struct Node* next=cur->next;cur->next=next->next;if(tail==NULL){newhead=tail=next;}else{tail->next=next;tail=next;}cur=cur->next;}return newhead;}

http://www.lryc.cn/news/230342.html

相关文章:

  • SpringBoot 全局异常之参数校验(1)
  • QT windows与linux之间sokcet通信中文乱码问题解决方法
  • Java实现DXF文件转换成PDF
  • 揭秘Vue中的nextTick:异步更新队列背后的技术原理大揭秘!
  • PHP使用文件缓存实现html静态化
  • A Gentle Introduction to Graph Neural Networks
  • 详解[ZJCTF 2019]NiZhuanSiWei 1(PHP两种伪协议、PHP反序列化漏洞、PHP强比较)还有那道题有这么经典?
  • bazel build使用【未完】
  • 11-13 /11-14代理模式 AOP
  • Ubuntu 创建并发布 Django 项目
  • SQL Server进阶知识
  • TFHEpp 使用记录
  • 大模型的实践应用6-百度文心一言的基础模型ERNIE的详细介绍,与BERT模型的比较说明
  • vue:如何把后端传过来的数组的其中一个对象加入新的属性
  • 数据库数据恢复—MSSQL报错“附加数据库错误823”如何恢复数据?
  • 如何使用 Java 设计一个简单的成绩计算程序
  • requests 在 Python 3.2 中使用 OAuth 导入失败的问题与解决方案
  • 山东省技能兴鲁网络安全大赛 web方向
  • No206.精选前端面试题,享受每天的挑战和学习
  • C#,数值计算——函数计算,Ratfn的计算方法与源程序
  • 排序算法之-快速
  • [vim]Python编写插件学习笔记2 - 分离
  • 【已解决】ModuleNotFoundError: No module named ‘kornia‘
  • 预览PDF并显示当前页数
  • 阿里云优惠券介绍、作用、领取入口及使用教程
  • Shell编程--流程控制
  • 设计模式-模板方法模式(Template Method)
  • 远程登录Linux方法(Linux平台相互远程;Windows远程登录Linux、远程编码、文件传输;无法远程登录的问题解决;c程序的编译)
  • macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导
  • Python武器库开发-flask篇之flask框架的安装(二十一)