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

复制带随机指针的链表

在这里插入图片描述
这道题的难点在于如何正确处理random指针的复制。

常规思路是使用哈希表建立旧节点到新节点的映射,但这需要O(n)的额外空间。

本文介绍一种空间复杂度O(1)的解法,核心是:

在原链表的每个节点后面紧跟着插入一个克隆节点。

1.创建克隆节点并插入原链表

遍历原链表,在每个原节点后面插入一个值相同的新节点,形成交替结构。

Node cur = head;
Node next = null;while (cur != null) {next = cur.next;           // 保存下一个原节点cur.next = new Node(cur.val);  // 创建克隆节点cur.next.next = next;      // 克隆节点指向下一个原节点cur = next;                // 移动到下一个原节点
}

2.设置克隆节点的random指针

由于克隆节点紧跟在原节点后面,如果原节点A的random指向节点B,那么A的克隆节点A’的random应该指向B的克隆节点B’,而B’恰好就是B.next

cur = head;
Node copy = null;while (cur != null) {next = cur.next.next;      // 下一个原节点copy = cur.next;           // 当前的克隆节点// 如果原节点的random不为空,// 则克隆节点的random指向原节点random的下一个节点(即克隆节点)copy.random = cur.random != null ? cur.random.next : null;cur = next;
}

3.分离新旧链表

把交织在一起的新旧链表分离开,恢复原链表的结构,同时得到独立的新链表。

Node ans = head.next;  // 新链表的头节点
cur = head;while (cur != null) {next = cur.next.next;      // 下一个原节点copy = cur.next;           // 当前克隆节点cur.next = next;           // 恢复原链表连接// 连接克隆链表copy.next = next != null ? next.next : null;cur = next;
}return ans;

完整代码:

public static Node copyRandomList(Node head) {if (head == null) {return null;}Node cur = head;Node next = null;// 创建克隆节点并插入while (cur != null) {next = cur.next;cur.next = new Node(cur.val);cur.next.next = next;cur = next;}cur = head;Node copy = null;// 设置random指针while (cur != null) {next = cur.next.next;copy = cur.next;copy.random = cur.random != null ? cur.random.next : null;cur = next;}Node ans = head.next;cur = head;// 分离链表while (cur != null) {next = cur.next.next;copy = cur.next;cur.next = next;copy.next = next != null ? next.next : null;cur = next;}return ans;
}
http://www.dtcms.com/a/490958.html

相关文章:

  • Promise 与 async/await
  • win11 字体变宽问题
  • 最好的做网站机械加工网站色彩搭配
  • Pytorch Yolov11目标检测+Android部署 留贴记录
  • iis 发布网站 404archlinux+wordpress
  • leetcode 2598. 执行操作后的最大 MEX 中等
  • SuperMap iObject Java实现倾斜数据预处理
  • 逻辑方阵(Logical Square)解说
  • Vue与React中动态导入的原理及实现差异解析
  • 有一个网站自己做链接获取朋友位置传媒公司属于什么行业类型
  • 服饰类电商网站建设策划昆山vi设计
  • aben.co微端侧模型价格实惠的服务商
  • 网站开发思维导图内容如何做一个单页面的网站
  • 【Qt】7.信号和槽_connect函数用法(2)
  • 网站的建设流程具体有哪些哪个合肥seo好
  • 大连公司网站建设站点与网站有什么区别
  • 高压混动救援的 “及时雨”:XRC-3363 系列救援充电器实操解析与安全要点
  • 玛哈特激光落料线:一条会“思考”的钢铁流水线
  • 《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
  • 现在做个人网站上海发布最新情况
  • 网站漂浮图片代码怎样把自己的网站上传
  • 如何做微网站社交电商怎么做
  • 离线安装NetData:高效监控服务器指南
  • 学习笔记-eventpp库
  • uni-app Vue 项目的规范目录结构全解
  • 在线预约导游|基于SSM+vue的在线预约导游系统(源码+数据库+文档)
  • 网站你懂我意思正能量免费网站推广策划的流程
  • 信宜网站建设公司厦门 网站建设
  • 免费建立网站的平台wordpress简体中文版下载
  • 在小车上挂载nfs