Q138 复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:

输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。提示:
- 你必须返回给定头的拷贝作为对克隆列表的引用。
/*
// Definition for a Node.
class Node {
    public int val;
    public Node next;
    public Node random;
    public Node() {}
    public Node(int _val,Node _next,Node _random) {
        val = _val;
        next = _next;
        random = _random;
    }
};
*/
class Solution {
    public Node copyRandomList(Node head) {
        if (head == null)
            return null;
        LinkedList<Node> list = new LinkedList<>();
        HashMap<Node, Node> map = new HashMap<>();
        Node node = head;
        while (node != null) {
            Node temp = new Node(node.val, node.next, node.random);
            map.put(node, temp);
            node = node.next;
        }
        for (Node n : map.keySet()) {
            Node temp = map.get(n);
            temp.next = map.get(n.next);
            temp.random = map.get(n.random);
        }
        return map.get(head);
    }
}
class Solution {
    public Node copyRandomList(Node head) {
        if (head == null)
            return null;
        Node node = head;
        while (node != null) {
            Node temp = new Node(node.val, node.next, node.random);
            node.next = temp;
            node = temp.next;
        }
        node = head;
        Node copyHead = head.next;
        while (node != null) {
            Node temp = node.next;
            if (temp.random != null) {
                temp.random = temp.random.next;
            }
            node = node.next.next;
        }
        node = head;
        while (node != null) {
            Node temp = node.next;
            node.next = temp.next;
            node = node.next;
            if (node != null)
                temp.next = node.next;
            else
                temp.next = null;
        }
        return copyHead;
    }
}Q138 复制带随机指针的链表的更多相关文章
- LintCode-105.复制带随机指针的链表
		复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 挑战 可否使用O(1)的空间 标签 哈希表 链表 优步 code / ... 
- Java实现 LeetCode 138 复制带随机指针的链表
		138. 复制带随机指针的链表 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/ ... 
- [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 ... 
- [LeetCode]138复制带随机指针的链表
		题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 思路: 先遍历链表,将每个节点对应的随机指针指向的对象利用Hash ... 
- 复制带随机指针的链表 · Copy List with Random Pointer
		[抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: 完完全全地复制,否则不好操作. 1-> ... 
- LeetCode 138——复制带随机指针的链表
		1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ... 
- Leetcode 138. 复制带随机指针的链表
		1.题目要求 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 2.解题思路 (1)笔试思路(求速度,拿分数):使用哈希表 /* ... 
- 138 Copy List with Random Pointer 复制带随机指针的链表
		给出一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点.返回一个深拷贝的链表. 详见:https://leetcode.com/problems/copy-list- ... 
- LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer
		给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. A linked list is given such that each no ... 
随机推荐
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
			SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ... 
- UVa 11136 Hoax or what (STL)
			题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ... 
- ImageUploader卸载教程-Xproer.ImageUploader
			1.1. 手动卸载控件-Windows XP 主要步骤如下: 1.关闭所有IE 2.打开cmd 3.进入C:\Windows\System32 4.输入命令regsvr32 -u ImageUploa ... 
- IE(IE6/IE7/IE8)支持HTML5标签
			让IE(ie6/ie7/ie8)支持HTML5元素,我们需要在HTML头部添加以下JavaScript,这是一个简单的document.createElement声明,利用条件注释针对IE来调用这个j ... 
- VC 调试技术与异常(错误)处理 VC 调试技术与异常(错误)处理
			调试技术与异常(错误)处理 (1) 转载自 52PK游戏论坛 跟踪与中间过程输出 也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的D ... 
- sun.misc.BASE64Decoder的风险
			问题描述 最近需要使用Base64上传图片,但是返现sun.misc.BASE64Decoder 为已经过期的包,此包为以前sun公司的内部包,可以下载此包,但是不利于现在Maven方式构建,可能会在 ... 
- GNOME桌面的安装
			首先搭建yum仓库 http://www.cnblogs.com/jw35/p/5967677.html yum grouplist #列出yum仓库里的软件组 ... 
- [Postgres]Postgres复制表
			在需要把含有分表的总表备份的时候想到的笨办法,如果有什么更先进的办法万望告知. 比如TableOld是由TableOld1,TableOld2,TableOld3组合而成,现在需要对TableOld进 ... 
- CentOS 新系统后配置
			1. 网络配置 略 1.2 ip_froward 查看 sysctl -a | grep ip_ 修改 vi /etc/sysctl.conf net.ipv4.ip_forward = 1 最大使用 ... 
- MSP430 G2553 LaunchPad设置GPIO
			一. 背景知识:逻辑运算符的使用 当程序初始化时,对于复位状态有不确定性的寄存器(如PxOUT),建议采用直接赋值:其他情况下最好使用逻辑运算符修改寄存器. 直接赋值 REGISTER = 0b111 ... 
