[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 ...
随机推荐
- OEM-ODM-OBM
Original Equipment ManufacturerOriginal Design ManufacturerOwn Branding & Manufacturing OEM,即“原始 ...
- js正则 - 正则判断是否为数字与字母的混合
function istrue(str){ var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i; return reg.test(str); ...
- Keepalived+Nginx高可用架构配置
1.yum install -y libnfnetlink-devel2.yum -y install libnl libnl-devel 3.yum -y install openssl-devel ...
- HTML上传文件支持大文件上传,下载
上传 1.修改配置文件web.config,在<system.webServer>下面加入 <security> <requestFiltering > <r ...
- Swift: 用UserDefaults保存复杂对象
一直木有看过这个细节,用UserDefaults是能不能存复杂一点的对象.大家可能都看到过UserDefaults的一个方法setObject: forKey:,用这个方法存过NSDictionary ...
- c需要注意的细节
1.在纯的.c文件中,例如struct Stu,之后不可以只使用Stu作为关键字来表示这个定义的结构体类型,一定要使用struct Stu一起作为类似int这种关键字来定义或者获取size. 2.函数 ...
- hdu 1012 素数判定
这道题~以前判定prime是一个个去试着整除再去存储,上次弄过欧拉函数那题目之后就知道了,这样会更快捷: prime[] = prime[] = ; ; i <maxn; i++) { if(! ...
- iOS4.0及以上系统,关闭程序,applicationWillTerminate为调用问题解决
iOS4.0以后系统支持多任务类型,程序按下home键后,程序进入后台运行,如果内存不足被系统关闭或者手动关闭,都不会调用applicationWillTerminate回调函数. 解决方法:可以在程 ...
- caffe 教程
Caffe是一个清晰而高效的深度学习框架,本文详细介绍了caffe的优势.架构,网络定义.各层定义,Caffe的安装与配置,解读了Caffe实现的图像分类模型AlexNet,并演示了CIFAR-10在 ...
- petapoco 新手上路
PetaPoco是一个轻量级ORM框架 用法可参考http://www.toptensoftware.com/petapoco/ https://github.com/CollaboratingPl ...