题目描述

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

题目分析

题中每个节点新增了 random 指针,指向链表中的 任意节点 或者 空 。这个 random 指针就意味着在复制时,除了基础的结点创建 ,还需要创建节点中的 pre.random指针及其指向的节点 。

本题难点

在复制链表的过程中构建新链表各节点的 random 引用指向。

解题

哈希映射

可以将原节点与新节点进行哈希映射,然后再查哈希表去构建每个节点的random指针。时间复杂度O(n) 空间复杂度O(n)

/*** Definition for a Node.* type Node struct {*     Val int*     Next *Node*     Random *Node* }*/ // 哈希表映射  时间复杂度O(n)  空间复杂度O(n)
func copyRandomList(head *Node) *Node {if head == nil {return head}// 新建链表,并将其与原链表结点映射nodeMap := make(map[*Node]*Node, 10)var newHead *Nodevar newCur *Nodecur := headfor cur != nil {node := new(Node)node.Val = cur.ValnodeMap[cur] = nodecur = cur.Nextif newCur == nil{newHead = nodenewCur = newHeadcontinue}newCur.Next = nodenewCur = newCur.Next}// 建立random关系cur = headnewCur = newHeadfor cur != nil {newCur.Random = nodeMap[cur.Random]newCur = newCur.Nextcur = cur.Next        }return newHead
}

衍生+拼接

可以先遍历一遍初始链表,在每个节点后衍生一个新节点,在创建新链表时,新节点的random指向的就是原节点random所指结点后的衍生结点。
初始链表

衍生结点

拆分还原链表

  1. 构建radom指向
  2. 拆分并还原链表
  3. 全部拆分并还原

代码实现

/*** Definition for a Node.* type Node struct {*     Val int*     Next *Node*     Random *Node* }*/// 拼装+分解
func copyRandomList(head *Node) *Node {if head == nil {return head}// 拼接子节点,在源节点后衍生新节点cur := headfor cur != nil {node := new(Node)node.Val = cur.ValnextNode := cur.Nextnode.Next = nextNodecur.Next = nodecur = nextNode}// 建立新节点random指向cur = headfor cur != nil {nextNode := cur.Nextif cur.Random != nil {nextNode.Random = cur.Random.Next}cur = nextNode.Next}// 将子节点从原链表中分离cur = headvar newHead *Nodevar newCur *Nodefor cur != nil {nextNode := cur.Nextcur.Next = nextNode.Nextcur = cur.Nextif newCur == nil {newHead = nextNodenewCur = newHeadcontinue}newCur.Next = nextNodenewCur = newCur.Next}return newHead}

剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)相关推荐

  1. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

  2. 剑指 Offer 35. 复杂链表的复制

    剑指 Offer 35. 复杂链表的复制 题目 题目链接 解题思路 题目理解 解题思路 具体代码 题目 题目链接 https://leetcode-cn.com/problems/fu-za-lian ...

  3. 【三次优化】剑指 Offer 35. 复杂链表的复制

    立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...

  4. 剑指offer——35复杂链表的复制

    这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...

  5. LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...

  6. 【算法】剑指 Offer 35. 复杂链表的复制 【重刷】

    1.概述 地址:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 请实现 copyRandomList 函数,复制一个复 ...

  7. leetcode 剑指 Offer 35. 复杂链表的复制

    题意 将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的节点(包括自身或者NULL). 解法 生成一个新的链表,然后根据新老链表同时循环遍历,找到当前老链 ...

  8. 【LeetCode 剑指 Offer 35. 复杂链表的复制(中等)】

    题目: 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  9. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

最新文章

  1. Node.js:路由
  2. lisp天正图元位置修改_块内图元的坐标定位[已解决]感谢版主
  3. oracle 学习小结11
  4. 史上最快消息内核——ZeroMQ
  5. node.js 爬虫入门总结
  6. Python机器学习:多项式回归与模型泛化003过拟合与欠拟合
  7. 输出毫秒_使用AMETEK直流电源实现波形变化的输出
  8. 技术总监夸我“索引”用的溜,我飘了......
  9. faster rcnn源码解析1
  10. 适合初学者的PASCAL VOC2012数据集的下载及简单讲解
  11. GPS经纬度的表示方法及换算
  12. JAVA博客和书籍推荐
  13. 【数据分析师---数据可视化】第二章:plotly绘图进阶篇(地图可视化,动态数据可视化)
  14. 安森美推出ecoSpin系列,重新定义无刷直流电机控制
  15. Excel中3个超级好用的条件求和的函数
  16. phpstorm9中文输入法不好用的解决方案
  17. 系统安全漏洞及解决方案
  18. 二级学科 计算机科学技术,一级学科、二级学科,考研专业哪个包含了计算机考研方向...
  19. 核心单词Word List 40
  20. python计算ema_Python第三方库TALIB对RSI的EMA算法,有偿求解答!

热门文章

  1. Spring Boot中对log4j进行多环境不同日志级别的控制
  2. 打造工业级推荐系统(三):推荐系统的工程实现与架构优化
  3. 基于深度学习的磁环表面缺陷检测算法
  4. 图书管理销售系统需求分析报告,对性能的规定以及运行环境规定部分
  5. Unity5和WebGL移植指南的一些总结
  6. bzoj1085骑士精神(搜索)
  7. 《信息安全系统设计基础》 实验五
  8. Redis学习一Redis的介绍与安装部署
  9. 类型,对象,线程栈和托管堆在运行时的相互关系(一)。
  10. springboot学习笔记-01-springboot-helloworld的编写以及原理初步了解(自动装配)