[LeetCode]138复制带随机指针的链表
题目描述:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深度拷贝。
思路:
先遍历链表,将每个节点对应的随机指针指向的对象利用HashMap存起来,key的值就为节点的在链表里面的位置,Value的值是随机指针指向的对象
再把原链表的节点对应的在链表中的位置存起来,key为节点对象,然后将节点的label取出来新建节点,存起来
再次遍历链表,处理随机指针
这是第一种用HashMap的办法,但是性能不行,还有优化的空间,之后我再研究研究看能不能改改
public static RandomListNode copyRandomList(RandomListNode head) {
HashMap<Integer,RandomListNode> randomMap = new HashMap<>();//随机节点
HashMap<Integer,RandomListNode> newMap = new HashMap<>();//新的节点
HashMap<RandomListNode,Integer> oldMap = new HashMap<>();//原表的节点
RandomListNode result = head;
if(head==null)
return head;
if(head.next==null){
RandomListNode it = new RandomListNode(head.label);
if (head.random!=null){
it.random = it;//指向自己
}
return it;
}
//迭代
RandomListNode iterator = head;
int i = 0;
while(iterator!=null){
//将第几位对应的随机指针存起来
randomMap.put(i,iterator.random);
//原链表节点对应的位置存起来
oldMap.put(iterator,i);
//新建节点,复制
RandomListNode node = new RandomListNode(iterator.label);
newMap.put(i,node);
if(i==0){
//第一个
result = node;
}
iterator = iterator.next;
i++;
}
i = 0;
iterator = head;
while(iterator!=null){
if(i>0)
newMap.get(i-1).next = newMap.get(i);
//检测原节点的随机指针是否为空
if(oldMap.get(randomMap.get(i))!=null){
//获得原链表节点的随机指针指向的对象的位置
int random = oldMap.get(randomMap.get(i));
//赋值
newMap.get(i).random = newMap.get(random);
}else {
//随机指针为空的情况
newMap.get(i).random = null;
}
iterator = iterator.next;
i++;
}
return result;
}
static class RandomListNode {
int label;
RandomListNode next, random;
RandomListNode(int x) { this.label = x; }
}
第二种办法,先将节点复制,插入到被复制的节点的后面,然后将随机节点加入进去,之后拆分链表
import java.util.*;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if (pHead==null)
return null;
RandomListNode current = pHead;
//将复制的节点插入
while (current!=null){
RandomListNode clone = new RandomListNode(current.label);
RandomListNode next = current.next;
current.next = clone;
clone.next = next;
current = next;
}
//将随机节点加入
current = pHead;
while (current!=null){
current.next.random = current.random==null?null:current.random.next;//指向新的随机节点
current = current.next.next;
}
//拆分
current = pHead;
RandomListNode res = pHead.next;
while (current!=null){
RandomListNode clone = current.next;
current.next = clone.next;
clone.next = clone.next==null?null:clone.next.next;
current = current.next;
}
return res;
}
[LeetCode]138复制带随机指针的链表的更多相关文章
- Java实现 LeetCode 138 复制带随机指针的链表
138. 复制带随机指针的链表 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/ ...
- LeetCode 138——复制带随机指针的链表
1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ...
- Leetcode 138. 复制带随机指针的链表
1.题目要求 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 2.解题思路 (1)笔试思路(求速度,拿分数):使用哈希表 /* ...
- 【leetcode 138. 复制带随机指针的链表】解题报告
方法一:递归 unordered_map<Node*,Node*> dict; Node* copyRandomList(Node* head) { if (!head) return h ...
- LintCode-105.复制带随机指针的链表
复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 挑战 可否使用O(1)的空间 标签 哈希表 链表 优步 code / ...
- LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. A linked list is given such that each no ...
- 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人公众号:负雪明烛 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https:/ ...
- 138 Copy List with Random Pointer 复制带随机指针的链表
给出一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点.返回一个深拷贝的链表. 详见:https://leetcode.com/problems/copy-list- ...
- [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
随机推荐
- tflite笔记
固化模型 方法一:freeze_graph方法 把tf.train.write_graph()生成的pb文件与tf.train.saver()生成的chkp文件固化之后重新生成一个pb文件 with ...
- IntelliJ IDEA 2017版 spring-boot 2.0.5 邮件发送简单实例 (三)
一.搭建SpringBoot项目 详见此文:https://www.cnblogs.com/liuyangfirst/p/8298588.html 注意: 需要添加mail依赖的包,同时还添加了lom ...
- 实现数组(java)
一,数组 java中有对数组的数据结构:数组就是一个存放固定数据的结构. 数组的声明举例:int [] array=new int [3],与之相同的是private in [ ] array; a ...
- 自定义消息的操作方法ON_MESSAGE(..)
- css 特殊使用技巧
1 border颜色设置 border-color: transparent black black black; 分别设置四条边框的颜色 上边transparent 透明无色 2 阴影 t ...
- Java理论学时第四节。课后作业。
请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { public static void main(String[] ar ...
- _ZSkill_快捷键_Xcode快捷键
Xcode 快捷键使用 Command 用来导航,控制导航区域 Alt 控制右边的部分. 如Assistant Editor ,utility editor. Control 编辑区域上的jump b ...
- War Chess (hdu 3345)
http://acm.hdu.edu.cn/showproblem.php?pid=3345 Problem Description War chess is hh's favorite game:I ...
- (动态规划)Worm -- hdu -- 2151
http://acm.hdu.edu.cn/showproblem.php?pid=2151 Worm Time Limit: 1000/1000 MS (Java/Others) Memory ...
- kepware http接口 nodejs开发
读取某变量的值(native var http = require("http"); var options = { "method": "GET&q ...