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

题目描述

请实现 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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶技术发展的5个阶段和现状

来源:智车科技摘要:自动驾驶的级别从L1到L5(SAE),清晰而直观,是大家讨论自动驾驶行业的一个基准。但是,它也很容易误导人。让人以为自动驾驶的技术会一级一级获得突破,最终迎来一辆L…

❤『知识集锦』一文搞懂mysql索引!!(建议收藏)

作者:不吃西红柿 简介:CSDN博客专家、蓝桥签约作者、大数据领域优质创作者。 以我的资历和文凭,将来这个城市的大街,都归我扫。 【系列课程介绍】 『面试知识集锦』系列课程包括以下20个系列,超过100篇文章。每篇文章…

新来报道

刚刚进入博客园,希望自己在技术上更上一层楼,加油。 给自己点鼓励.一切问题都是可以解决的。遇到问题不要后退,要努力,坚持去解决。坚持学习,坚持写博客,从基础写起。 算来算去,自己也工作几年了…

AI芯片的过去、现在与未来

来源:华尔街见闻摘要:AI芯片似乎没能表现得比人类更智能,但它们的学习能力很强,未来可以变得更聪明。算法和芯片系统的设计都可以进步,这需要AI芯片具备更高级的记忆系统和连接机制,以及承载深度学习数据流…

链表(图文详解)

链表的概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。   链表的结构是多式多样的,当时通常用的也就是两种:   无头单向非循环列表:结构简单&…

sql join中on条件后接and和where

目录 场景1:left join on a.xx b.xx and a.xx2 aa 场景2:left join on a.xx b.xx and b.xx2 aa 场景3:left join on a.xx b.xx where b.xx2 aa 场景4:inner join on a.xx b.xx where a.xx2 aa 场景5:…

最近学gvim,mark低先

1. vim基本用法:模式,光标移动,查找替换,复制粘贴删除 1.1 帮助 :help :help command 1.2 模式切换 命令模式 Esc, Ctrl-c, 配合光标移动可用Alt-h,Alt-j,Alt-k,Alt-l 编辑模式 i 在当前位置编辑 , a在当前位置后面…

❤「和平精英」被python爬虫了?看看你最适合什么配件!❤

作者简介:不吃西红柿,CSDN博客专家、蓝桥签约作者。 困难像弹簧,你弱它就强,你强它更强。 求点赞、求关注 写作目的: 1、练习爬虫技术; 2、深入了解和平精英枪械属性,提高吃鸡概率。 一、爬前…

(相当全面)node.js 初体验

转载自:http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 最近写的文章收到许多朋友的反馈,感谢大家的支持和建议,让我对坚持写博客充满热情,一个月一篇文章确实有点少,所以以后尽力多做分享&#…

创作表情包(备用)

👶🧒👦👧🧑👱👨🧔👨‍🦰👨‍🦱👨‍🦳👨‍🦲👩👩‍&#x1f9b0…

安装redis和phpredis模块

redis的下载及安装:ubuntu:/$ mkdir /usr/local/redisubuntu:/$ cd /usr/local/redisubuntu:/$ wget http://redis.googlecode.com/files/redis-2.4.2.tar.gzubuntu:/$ tar xzf redis-2.4.2.tar.gzubuntu:/$ cd redis-2.4.2ubuntu:/$ makeubuntu:/$ src/redis-serve…

深度 | 激光雷达独角兽Quanergy的危急时刻

来源:网易智能编译摘要:全球知名的激光雷达制造商 Quanergy 最近陷入了麻烦之中。早在2014年,Quanergy公司就发现自己正身处于一场对自动驾驶汽车突如其来的狂热之中。Quanergy公司制造了激光雷达技术,这是一种将激光反射到物体上…

R语言【dplyr】——case_when()是一般向量化的 if-else(),该函数允许您将多个 if_else() 语句矢量化

Package dplyr version 1.1.4 Parameters case_when(..., .default NULL, .ptype NULL, .size NULL) 参数【...】&#xff1a;<dynamic-dots> 一组两面公式&#xff08;two-sided formulas&#xff09;。 公式左边&#xff08;left hand side&#xff0c;LHS&#…

❤ 就这?TypeScript其实并不难!(建议收藏)❤

&#x1f388; 作者&#xff1a;不吃西红柿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;、蓝桥签约作者、Python领域优质创作者、信息技术智库公众号创建者✌。技术交流、面试刷题尽管关注咨询我。 热门专栏推荐&#xff1a; &#x1f947; 知识集锦专栏&…

EntityModelStudio系列教程2--静态建模之实体模型设计

在EMStudio中静态建模的概念和内容是来自于UML标准的&#xff0c;所以EMStudio提供的静态建模的设计能力是完全可以满足开发者的设计要求的。但是与UML标准比较&#xff0c;EMStudio中的静态建模还存在两个不同的特色&#xff1a; 1. 类与实体的概念是一致的 也就是说&#xff…

Python 编码规范(Google) (一)

Python 风格规范(Google) 本项目并非 Google 官方项目, 而是由国内程序员凭热情创建和维护。 如果你关注的是 Google 官方英文版, 请移步 Google Style Guide 以下代码中 Yes 表示推荐&#xff0c;No 表示不推荐。 分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行…

前沿科技山雨欲来,四大领域存创新机会

来源&#xff1a;北极光创投摘要&#xff1a;最近&#xff0c;北极光创投董事总经理杨磊&#xff0c;发表了《前沿科技山雨欲来》的主题演讲&#xff0c;他认为目前全球正处于前沿科技爆发前夜&#xff0c;他看好计算构架变革、移动终端、机器人、生物科技与IT融合四大领域的创…

❤JavaScript系列6部曲:语法篇(万字长文)❤

&#x1f388; 作者&#xff1a;不吃西红柿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;、蓝桥签约作者、Python领域优质创作者、信息技术智库公众号创建者✌。技术交流、面试刷题尽管关注咨询我。 热门专栏推荐&#xff1a; &#x1f947; 知识集锦专栏&…

工业机器人发展现状:硬件制造大同小异,视觉感知绘新蓝图

来源 &#xff1a;亿欧摘要&#xff1a;8月15日-8月19日&#xff0c;在北京亦庄国际会展中心举办了为期五天的2018世界机器人大会。小编认为&#xff0c;国内工业机器人的总体水平在未来长期时间将处于稳定上升区&#xff0c;而两极分化趋势愈显。8月15日-8月19日&#xff0c;在…

❤️JavaScript系列6部曲:流程控制(万字长文)❤️

&#x1f388; 作者&#xff1a;不吃西红柿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;、蓝桥签约作者、Python领域优质创作者、「信息技术智库」公号作者✌。技术交流、面试刷题尽管关注咨询我。 热门专栏推荐&#xff1a; &#x1f947; 知识集锦专栏&…