复杂链表的复制(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 ...
随机推荐
- busybox编译
sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'Coreutils—>sync选项去掉 nsenter.c:(.tex ...
- js重点--闭包
闭包: 1.获取到局部变量,相当于是函数局部与外部的桥梁 2.使局部变量保存在内存中,不被回收 <script> function outerFn() { var outerVar = 0 ...
- Django的admin视图的使用
要现在admin.py文件中将你要视图化操作的类进行注册: from django.contrib import admin from api import models # Register you ...
- IIS版本号可以被识别 解决方案
1.在IIS配置文件中进行修改. 借助IIS URL Rewrite Module,添加如下的重写规则: <rewrite> <allowedServerVariables> ...
- 跟踪调试JDK源码时遇到的问题及解决方法
目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...
- 未能找到类型或命名空间名称“Quartz”
C# 项目中使用Quartz必须使用.NetFrameWork4,而不能使用Client,否则的话会出现如题所示错误.
- ASP.NET Web API 2 之路由配置
Ø 简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...
- UE4 AR开发笔记
1.基础使用 ArToolKit:生成图片特征,可以用彩图.(图片先灰化) genTexData效准相机.由于有的相机照相有弧度. calib_camera 2.使用UE4ARPlugins做 ...
- 第29月第14天 evpp
1.evpp https://github.com/Qihoo360/evpp/tree/master/examples/recipes/self_control_timer https://blog ...
- django中的反向解析
1,定义: 随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超 ...
