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