复杂链表的复制(Hard)
问题来源:选自LeetCode 138:复制带随机指针的链表
问题描述:
题目给定信息:
该链表中每一个节点的成员变量都有两个,一个是next指针指向该节点的下一个节点,一个是random指针指向不确定,可以指向该链表中任意一个节点,也可以指向它自己,还可以指向为空,我们要克隆这个链表,并且保证每一个链表节点的两个指针都和原链表是一样的。
问题分析:

我们可以间接的利用节点地址和节点序号之间的映射关系,在Map集合中存贮两个链表(原链表和新建待克隆链表)的映射关系。通过一个while循环,创建出和每个链表节点值相同的节点,并且把这些节点都按照映射关系存进Map集合中,在这个循环中还能把新创建的节点的next指针赋上相应的值。然后再经过一个while循环,每遍历到原链表的一个节点,我们就在Map集合中找到该节点映射对应的新创建节点是哪一个,这样就能给新创建的节点的random指针进行赋值操作,便利循环结束,新创建的每一个节点的random指针也全部赋值结束。返回新创建的链表头指针就可以了。
函数实现:
方法一:
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node newHead = new Node(head.val, null, null);
Node temp = head.next;
Node temp_New = newHead;
Map<Node, Node> map = new HashMap<>();
map.put(head, newHead);
while (temp != null) {
Node newList = new Node(temp.val, null, null);
map.put(temp, newList);
temp_New.next = newList;
temp_New = newList;
temp = temp.next;
}
temp = head;
temp_New = newHead;
while (temp != null) {
temp_New.random = map.get(temp.random);
temp = temp.next;
temp_New = temp_New.next;
}
return newHead;
}
方法二:
public Node copyRandomList(Node head) {
Map<Node, Integer> map = new HashMap<Node, Integer>();
Vector<Node> vector = new Vector<Node>();
Node node = head;
int i = 0;
while (node != null) {
vector.add(new Node(node.val, null, null));
map.put(node, i);
node = node.next;
i++;
}
node=head;
i=0;
while(node!=null){
vector.get(i).next=vector.get(i+1);
if(node.random!=null){
int id=map.get(node);
vector.get(i).random=vector.get(id);
}
node=node.next;
i++;
}
return vector.get(0);
}
运行结果:

复杂链表的复制(Hard)的更多相关文章
- 剑指Offer面试题:24.复杂链表的复制
一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...
- (剑指Offer)面试题26:复杂链表的复制
题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表. 在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还 ...
- 剑指Offer24 复杂链表的复制
/************************************************************************* > File Name: 24_Comple ...
- C语言之复杂链表的复制(图示详解)
什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点.今天我们要 ...
- 剑指offer面试题26:复杂链表的复制
题目:请实现一个函数,复制一个复杂链表. 在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中的任意结点或者nulL 直观解法: 1.遍历链表,复制链表节 ...
- 剑指offer-复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 剑指Offer 25. 复杂链表的复制 (链表)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 【Java】 剑指offer(35) 复杂链表的复制
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现函数ComplexListNode* Clone(Compl ...
- 《剑指offer》— JavaScript(25)复杂链表的复制
复杂链表的复制 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数 ...
- 剑指offer——35复杂链表的复制
这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...
随机推荐
- SpringBoot系列: Pebble模板引擎语法介绍
本文基于Pebble官方文档, 对pebble的语法做一些介绍. ===============================Pebble 官方资料========================= ...
- SHELL希尔排序
/****************************************************************************** * Compilation: javac ...
- 已知 $AB$, 求 $BA$
设 $A,B$ 分别是 $3\times 2$ 和 $2\times 3$ 实矩阵. 若 $\dps{AB=\sex{\ba{ccc} 8&0&-4\\ -\frac{3}{2}& ...
- java8 list转map
//按id属性为map的key值 Map<Integer, User> userMap = list.stream().collect(Collectors.toMap(User::get ...
- -bash: Chmod: command not found
是增加该文件的所有者拥有运行权限 如果所有者是root ,还要加sudo chmod u+x drlinuxclient.bin (sudo) chmod u+x drlinuxclient.bin ...
- sqlserver 获取所有表的字段类型等信息
USE [MultipleAnalysisDataFY] GO /****** Object: View [dbo].[selectfieldtype] Script Date: 2018/11/7 ...
- C# 执行oracle sql 语句出现中文不兼容的问题
最近我用C#调用 操作oracle 数据库 出现了一个问题就是 我的查询语中的条件语句 含有中文 字符在C#中查询不了 ,但是在pl sql 中能够正常的查询出来. 这个原因是 C# 执行orccl ...
- python3: 简单4步骤输出九九乘法表
如何输出一个九九乘法表,使用python语言,嵌套循环,4行代码就可以实现,瞬间感觉python真的很简单~ 代码: for i in range(1,10): for j in range(1,i+ ...
- 在GridView中使用FindControl
DataRowView dv =(DataRowView)e.Row.DataItem;string id=dv.Row["ProjectID"].ToString(); 1.在行 ...
- Linux 踩过的坑系列-01
关于默认网关的添加.记得楼主之前有一次,无意之间,也不知道做了什么删除文件里面内容的操作,配置好静态IP之后上不了外网.翻阅个各种资料都是没有找到问题.最后发现问题在于配置的虚拟机网卡文件的网关打错了 ...
