Leetcode042--链表的深度拷贝
来源:互联网 发布:xcode windows能用吗 编辑:程序博客网 时间:2024/06/01 18:20
一、原题
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
一、中文
链表的每个元素不仅有指向下一个结点的指针,还包括了一个随机的指针,对这样的链表进行一个深度的拷贝
三、举例
先来区分一个深拷贝和浅拷贝吧,浅拷贝是拷贝一引用,而深拷贝拷贝的不仅仅是引用,还包括引用所属的值,简单的说就说拷贝另一份
四、思路
(1)新建一个链表的头结点,建立以HashMap,将新老结点以键值对的方式存储在Map中
(2)然后遍历原来链表,根据它复制新的结点,也是以键值对的方式存储在Map中
(3)最后再从头遍历,将Random的指针进行赋值,注意random指针必须得在链表建立的基础之上才可以,要不没办法指向
Random的指向拷贝以Map的形式可能不好理解,其实random也就是next.next...的形式,也是复制的next,这样就理解了
五、程序
程序如下:
/** * Definition for singly-linked list with a random pointer. * class RandomListNode { * int label; * RandomListNode next, random; * RandomListNode(int x) { this.label = x; } * }; */import java.util.*;public class Solution { public RandomListNode copyRandomList(RandomListNode head) { if(head == null){ return head; } //新建一个链表的头结点 RandomListNode newHead = new RandomListNode(head.label); RandomListNode oldp = head.next; RandomListNode newp=newHead; Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>(); map.put(newp, head); //对旧链表进行复制 while(oldp != null){ RandomListNode temp = new RandomListNode(oldp.label); map.put(temp, oldp); newp.next = temp; newp = newp.next; oldp = oldp.next; } //将Random指针进行复制 newp = newHead; oldp = head; while(newp != null){ //这里的random指针相当于有几个next比较好理解 newp.random = map.get(newp).random; newp = newp.next; oldp = oldp.next; } return newHead; }}
1 0
- Leetcode042--链表的深度拷贝
- leetcode-异形链表的深度拷贝
- 深度拷贝复杂链表的巧妙解法
- Lua Table表的深度拷贝
- 深度拷贝的重要性
- C++的深度拷贝
- 对象的深度拷贝
- Flex:对象的深度拷贝
- 深度拷贝、浅度拷贝、数组的拷贝
- 附有随机结点指针的链表的深度拷贝 Copy List with Random Pointer
- 深度拷贝
- python 的拷贝、深度拷贝及内存管理
- [NET]深度拷贝的实现(DeepCopy)
- as3.0深度拷贝--新的内存空间
- 深度拷贝的语法和实现
- List.toArray()采用的是深度拷贝
- Perl中哈希结构的深度拷贝
- Java编程基础-----对象的深度拷贝
- java 数字转换成字符串
- input框只能输入数字和小数点
- 浏览器内核的解析和对比
- 大屏可视化助力大数据应用落地
- Elasticsearch系列01:基础教程
- Leetcode042--链表的深度拷贝
- git使用详细介绍
- Context
- ADB原理,Wi-Fi连接,常用命令及拓展
- 亚马逊的策略分析:不仅仅是电商,AI构建新的业务支柱
- MVC 4中使用ServiceStack.Redis实现Redis队列【错误日志并发处理】
- There is already 'xxxxx' bean method
- Unity3d 实现MeshRender 材质球的遮罩
- 如何提高编程水平,老程序员的几个建议你是否认同