Copy List with Random Pointer
来源:互联网 发布:xp能装MySQL 编辑:程序博客网 时间:2024/06/17 07:04
1.题目
给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。2.算法
先按照复制一个正常链表的方式复制,复制的时候把复制的结点做一个HashMap,以旧结点为key,新节点为value。这么做的目的是为了第二遍扫描的时候我们按照这个哈希表把结点的随机指针接上。
public RandomListNode copyRandomList(RandomListNode head) { if (head == null){return head;}HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();RandomListNode newHead = new RandomListNode(head.label); //创建HashMap,键为旧链表,值为新链表map.put(head, newHead);RandomListNode pre = newHead;RandomListNode node = head.next;while (node != null) //把链表填进HashMap中{RandomListNode newNode = new RandomListNode(node.label);map.put(node, newNode);pre.next = newNode;pre = newNode;node = node.next;}node = head;RandomListNode copyNode = newHead;while (node != null) //找到节点的random节点,并接上{copyNode.random = map.get(node.random);copyNode = copyNode.next;node = node.next;}return newHead;}
算法2:我们还可以这样做题,三次扫描链表,第一次扫描复制链表,也就是对每个节点复制,让新节点接在旧节点的next,第二次我们把旧节点的随机指针付给新节点的随机指针,第三次我们把新旧链表拆开
public RandomListNode copyRandomList(RandomListNode head) { if (head == null){return head;}RandomListNode node = head;while (node != null) //复制链表{RandomListNode newNode = new RandomListNode(node.label);newNode.next = node.next;node.next = newNode;node = newNode.next;}node = head;while (node != null) //链表节点随机指针赋值{if (node.random != null){node.next.random = node.random.next;}noed = node.next.next;}RandomListNode newHead = head.next;node = head;while (node != null) //拆开新旧链表{RandomListNode newNode = node.next;node.next = newNode.next;if (newNode.next != null){newNode.next = newNode.next.next;}node = node.next;}return newHead;}
0 0
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Copy List with Random Pointer
- Chapter 18 Parallel Processing
- Github+Jekyll搭建个人博文网站
- BZOJ 2565 最长双回文串
- jQuery事件-键盘事件
- JavaScript中的字符串(String)的常用方法
- Copy List with Random Pointer
- switch语句的表达式可以是哪些类型?
- 【Shader】用一张渐变图实现卡通渲染效果
- Java线程-同步和异步的区别
- 电脑cpu怎么看 怎么看cpu好坏 (全文)
- CentOS 6升级python 2.6到2.7
- jquery .ajax demo 传参数给后台@RequestBody @RequestParms
- 巧用Grep 命令
- Retrofit+Rxjava的完美结合