Copy List with Random Pointer(复杂链表复制)
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
第一种方法:使用map存放原节点和其复制节点。然后再给复制节点的next/random指针初始化。初始化时,原节点p,p的复制节点的next=p.next的复制节点
见代码:
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null) return null;
//map存放原节点和复制节点
Map<RandomListNode,RandomListNode> map=new HashMap<RandomListNode,RandomListNode>();
RandomListNode p=head;
//将所有节点及其复制节点放到hashmap中
while(p!=null){
map.put(p,new RandomListNode(p.label));
p=p.next;
}
//给复制节点的指针赋值
p=head;
while(p!=null){
map.get(p).next=map.get(p.next);//p的复制节点的next等于p.next的复制节点。
map.get(p).random=map.get(p.random);
p=p.next;
}
return map.get(head);
}
第二种方法:
分三步:
1、根据next指针,复制原链表,在原链表中复制,将所有节点复制到原节点后面(如a->b->c复制成a->a'->b->b'->c->c')
2、根据链表的random指针,在新链表中初始化复制节点的random指针。.next.random=.random.next
3、从复制后的链表中拆分出新的复制链表返回
如果只有一个next指针,则省略上面第2步
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null) return null;
RandomListNode pCur=head;//用于遍历
//第一步,根据next指针复制如a->b->c复制成a->a'->b->b'->c->c'
while(pCur!=null){
RandomListNode node=new RandomListNode(pCur.label);
node.next=pCur.next;
pCur.next=node;
pCur=node.next;
} pCur=head;
//第二步,初始化复制后节点的random指针
while(pCur!=null){
if(pCur.random!=null){ //不用判断p.next是否为空,因为p不为空,p.next是复制节点,肯定不为空
pCur.next.random=pCur.random.next;//要指向p.random的复制节点,所以有.next }
pCur=pCur.next.next;
} //第三步,拆分
RandomListNode phead=head.next;
RandomListNode p=phead;
pCur=head;
while(pCur!=null){
pCur.next=pCur.next.next;
if(p.next!=null){
p.next=p.next.next;
}
p=p.next;
pCur=pCur.next;
} return phead;
}
可以看出,上面第一种方法简单很多。
Copy List with Random Pointer(复杂链表复制)的更多相关文章
- leetcode 138. Copy List with Random Pointer复杂链表的复制
python代码如下: # Definition for singly-linked list with a random pointer. # class RandomListNode(object ...
- 133. Clone Graph 138. Copy List with Random Pointer 拷贝图和链表
133. Clone Graph Clone an undirected graph. Each node in the graph contains a label and a list of it ...
- 16. Copy List with Random Pointer
类同:剑指 Offer 题目汇总索引第26题 Copy List with Random Pointer A linked list is given such that each node cont ...
- 【LeetCode练习题】Copy List with Random Pointer
Copy List with Random Pointer A linked list is given such that each node contains an additional rand ...
- Copy List with Random Pointer leetcode java
题目: A linked list is given such that each node contains an additional random pointer which could poi ...
- [Leetcode Week17]Copy List with Random Pointer
Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ...
- LintCode - Copy List with Random Pointer
LintCode - Copy List with Random Pointer LintCode - Copy List with Random Pointer Web Link Descripti ...
- [LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label ...
- LeetCode OJ:Copy List with Random Pointer(复制存在随机链接的链表)
A linked list is given such that each node contains an additional random pointer which could point t ...
随机推荐
- Java --Annotation学习心得体会及笔记
相对于注释这种给程序员看的信息: 注解,就是给程序看的解释性的语言,其作用就相当于配置文件的存在.其存在的意义在于以下几点: 优点: 方便的使程序员看到相关项的关联位置及关联方式等信息. 缺点: 由于 ...
- (八十八)VFL语言初步 - 实现布局
[基本语法] VFL的语法为H:和V:开头,代表水平和垂直. 接下来如果要涉及距离,使用|-x-,x为距离的点数. 对于视图,用[ ]包围,例如[blueView]. ①下面的语句实现了blueVie ...
- [GitHub]第二讲:GitHub客户端
文章转载自http://blog.csdn.net/loadsong/article/details/51591456 Git 是一个分布式的版本控制工具,即使我不联网,也可以在本地进行 git 的版 ...
- 【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- visual studio 2015使用python tools远程调试maya 2016
步骤: 1. 去https://apps.exchange.autodesk.com/MAYA/en/Home/Index搜索Developer Kit并下载,maya 2016可以直接点击这里下载. ...
- IMX51---GPIO
GPIO(General Purpose Input/Output)指通用输入/输出,IMX51的GPIO模块提供32位双向的.通用输入和输出的信号,下图是GPIO的框图: 图1 1. GP ...
- maven -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME
遇到错误:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME解决办法:在环境变量中设置M2_HO ...
- Dynamics CRM2013 定制你的系统登录后的首页面
在2013中个性设置中又多了一个新的,更好的增强了用户体验,对于特定的用户而言只需要使用系统的一小块功能,所以很多用户进入 系统只需要显示跟自己业务相关的功能页面即可. 点右上角的齿轮进入选项,在常规 ...
- javascript之DOM编程实现城市的联动框
需求;用一张图片表示. 分析: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 【一天一道LeetCode】#77. Combinations
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...