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

hot100 138.随机链表的复制

1.题目要求:深拷贝一个链表,要求新链表中的每个节点都是新创建的,并且这些节点的random指针都指向新链表中的相应节点。

2.思路:

(1)如果没有random指针,只需要在遍历链表的同时,依此复制每个节点(创建新节点并复制val),添加在新链表的末尾。

(2)有random指针,拷贝就变得复杂了。需要知道random指向的那个节点,在新链表中是哪个节点。

(3)所以必须记录原链表节点到新链表节点的映射(map)。这样可以通过原链表random指向的节点,知道新链表的random应该指向哪个节点。

(4)难道应该使用哈希表吗?其实不需要。可以把新链表和旧链表“混在一起”。

(5)举例:有一个链表1->2->3,依次复制每个节点(创建新节点并复制val和next),把新节点直接插到原节点的后面,形成一个交错链表:1->1'->2->2'->3->3'。

(6)此时,原链表节点的下一个节点,就是其对应的新链表节点了。

(7)然后遍历这个交错链表,假如节点1的random指向节点3,那么就把节点1'的random指向节点3的下一个节点3',这样就完成了对random指针的复制。

(8)最后,从交错链表中分离出1'->2'->3',即为深拷贝后的链表。(注意:不能只删除节点1,2,3,因为题目要求原链表的next不能修改)。

3.复杂度分析:

(1)时间复杂度:O(n),其中n是链表的长度。

(2)空间复杂度:O(1),返回值不计入。

附代码:

class Solution { public Node copyRandomList(Node head) { if(head == null){ return head; } //复制每个节点,把新节点直接插到原节点的后面 for(Node cur = head;cur != null;cur = cur.next.next){ cur.next = new Node(cur.val,cur.next); //创建一个新节点:复制原节点的值,将新节点的next指向原节点的下一个节点 } //遍历交错链表中的原链表节点 for(Node cur = head;cur != null;cur = cur.next.next){ if(cur.random != null){ //要复制的random是cur.random的下一个节点 //cur表示每一个原节点 //cur.next表示每一个复制节点 //cur.next.random表示每一个复制节点的random指针 //cur.random表示每一个原节点的random指针 //cur.random.next表示每一个原节点的random指针的下一个节点,即原节点的的random指针指向节点的对应复制节点 cur.next.random = cur.random.next; } } //把交错链表分离成两个链表 Node newHead = head.next; //新链表的头是原链表头的复制节点 Node cur = head; //表示当前处理的原节点 //cur在循环外声明,是为了保证后面循环结束后仍可以访问cur for(;cur.next.next != null;cur = cur.next){ //当cur后面至少有两个节点时继续循环,因为要保证当前原节点有复制节点和下一个原节点 Node copy = cur.next; //用copy表示当前复制节点 cur.next = copy.next; //原节点指向下一个原节点 copy.next = copy.next.next; //复制节点指向下一个复制节点 } // cur.next.next == null时,循环结束,此时cur指向最后一个原节点 cur.next = null; //恢复最后一个原节点的指针指向,最后一个原节点应该指向null return newHead; } }
http://www.jsqmd.com/news/156878/

相关文章:

  • PyTorch-CUDA-v2.6镜像中配置Jupyter Notebook主题美化界面
  • PyTorch-CUDA-v2.6镜像中实现Early Stopping防止过拟合
  • Elasticsearch可视化工具结合Query Bar的高效搜索策略
  • 铁视频从车站到线路、NOCC,再到公安部门出现卡顿的问题
  • WinDbg Preview下载与远程调试连接配置方法
  • 解决Vetur在Vue2中的类型提示问题:实战案例
  • PyTorch-CUDA-v2.6镜像部署Text-to-SQL自然语言查询数据库
  • Allegro导出Gerber文件在电机控制器中的应用
  • PyTorch-CUDA-v2.6镜像中使用Ray分布式计算框架扩展训练
  • 大疆Pocket 3线上租赁系统:大学生创业的轻量化商业方案
  • Infineon TC3xx上运行AUTOSAR OS的时钟系统配置操作指南
  • PyTorch-CUDA-v2.6镜像中运行BLIP图像描述生成模型体验
  • PyTorch安装教程GPU版:基于CUDA-v2.6的一键部署方案
  • 下车乘客的规律 分析和挖掘
  • 快速理解USB3.0传输速度:基础性能测试通俗解释
  • PyTorch-CUDA-v2.6镜像部署CodeLlama代码生成模型应用场景分析
  • 企业聊天软件为什么选择私有化部署更安全?
  • 图解说明Kibana界面布局:elasticsearch可视化工具通俗解释
  • 基于EB Tresos的网络管理配置操作指南
  • 从零实现Elasticsearch与Logstash协同部署的操作步骤
  • 从零开始配置PyTorch+GPU环境:推荐使用PyTorch-CUDA-v2.6镜像
  • 《P4071 [SDOI2016] 排列计数》
  • IDA Pro macOS版本下载实录:项目应用中的配置经验
  • PyTorch-CUDA-v2.6镜像支持vLLM加速大模型推理吗?测试反馈
  • PyTorch-CUDA-v2.6镜像中运行FastViT图像分类模型表现如何?
  • hbuilderx制作网页完整指南:集成 Git 进行版本控制
  • 吃透Set集合,这篇练习帖就够了!
  • PyTorch-CUDA-v2.6镜像中运行Whisper Large V3语音识别精度测试
  • PyTorch-CUDA-v2.6镜像部署Graph Neural Network图神经网络
  • 通俗解释USB接口有几种命名规则