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

力扣每日一道系列 --- LeetCode 138. 随机链表的复制


在这里插入图片描述

📷 江池俊: 个人主页

🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道

🌅 有航道的人,再渺小也不会迷途。

LeetCode 138. 随机链表的复制

在这里插入图片描述

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 x.random --> y

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null

你的代码 接受原链表的头节点 head 作为传入参数。

在这里插入图片描述

迭代 + 节点拆分

思路及算法:

此处的难点就是如何 copy 深拷贝的节点的 random ?
思路是:将 copy 的节点依次插入到相应节点的后面,从而保证 copy 与相应的节点保持联系,而要找 copy 的节点的 random
就是先找到与 copy 对应的节点的 random ,而 randomnext 就是 copy 节点的 random ,因为 copy 节点是对应节点的后一个节点,故 copy 节点的 random 就是对应节点的后一个,它们对应的位置是不变的,copy 节点总是对应节点的后一个位置这里可以理解为假设你目前是一个单身狗,你想要找一个女朋友,而你的好兄弟有女朋友这时,你通过你跟你好兄弟的这层关系就可以去找好兄弟的女朋友把他的闺蜜介绍给你。

  1. 我们首先将该链表中每一个节点拆分为两个相连的节点,例如对于链表 A→B→C,我们可以将其拆分为 A→A′→B→B′→C→C′
    对于任意一个原节点 S,其拷贝节点 S′ 即为其后继节点。
  2. 这样,我们可以直接找到每一个拷贝节点 S′ 的随机指针应当指向的节点,即为其原节点 S 的随机指针指向的节点 T 的后继节点
    T′。需要注意原节点的随机指针可能为空,我们需要特别判断这种情况。
  3. 当我们完成了拷贝节点的随机指针的赋值,我们只需要将这个链表按照原节点与拷贝节点的种类进行拆分即可,只需要遍历一次。同样需要注意最后一个拷贝节点的后继节点为空,我们需要特别判断这种情况。
    在这里插入图片描述 在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return NULL;}//1.复制对应的链表节点,并连接在相应链表节点的后面struct Node* cur = head;while(cur){struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));newnode->val = cur->val;newnode->next = cur->next;cur->next = newnode;cur = newnode->next;}//2.处理复制链表节点的randomcur = head;while(cur){if(cur->random)cur->next->random = cur->random->next;elsecur->next->random = NULL;cur = cur->next->next;}//3.将原链表和复制链表拆分开,返回复制链表的头节点struct Node* newhead = head->next;struct Node* newcur = newhead;head->next = head->next->next;cur = head->next;while(cur){newcur->next = newcur->next->next;newcur = newcur->next;cur->next = cur->next->next;cur = cur->next;}newcur->next = NULL;return newhead;
}

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

相关文章:

  • 无人零售:创新优势与广阔前景
  • 【华为OD题库-022】阿里巴巴找黄金宝箱(IV)-java
  • Linux 图形界面配置RAID
  • (脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别)、( 什么是qps,tps,并发量,pv,uv)、(什么是接口幂等性问题,如何解决?)
  • 安全通信网络(设备和技术注解)
  • 深度学习_12_softmax_图片识别优化版代码
  • element-ui设置下拉选择切换必填和非必填
  • Linux的命令——关于操作用户及用户组的命令
  • pycharm 设置多级跳转SSH
  • LeetCode 189.轮转数组(三种方法解决)
  • GB28181设备对接视频流的流程
  • 类属性修改(为什么python类不具备被赋值能力?)
  • uniapp App端 解决input@input事件动态修改值不生效的问题
  • ELK分布式日志
  • Kylin-Server-V10-SP3+Gbase+宝兰德信创环境搭建
  • po与vo互转工具类
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)
  • PyCharm:2023新版PyCharm无UI工具栏,如何回旧版
  • 阿里云国际站:云备份
  • C#中.NET 6.0 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录
  • kafka+ubuntu20.04+docker配置
  • 遍历一个对象,并得出所对应的值
  • WGCLOUD的特点整理
  • 新版软考高项试题分析精选(三)
  • 从申请服务器到Docker部署Java项目至最后运行完结
  • 解决 requests.post 数据字段编码问题的方法
  • 安全运维:cmd命令大全(108个)
  • 构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)
  • Flowable自定义Id生成器
  • 怎样正确选择等保测评机构开展等保测评工作?