138. Copy List with Random Pointer

来源:互联网 发布:战地之王透视源码 编辑:程序博客网 时间:2024/06/06 18:05

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

这道题的意思是让完全拷贝一个链表。

方法一:第一次遍历用hashmap存对应的节点,第二次遍历存储相应的next和random节点。代码如下:

/** * Definition for singly-linked list with a random pointer. * class RandomListNode { *     int label; *     RandomListNode next, random; *     RandomListNode(int x) { this.label = x; } * }; */public class Solution {    public RandomListNode copyRandomList(RandomListNode head) {        HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();        RandomListNode tempNode = head;        while (tempNode != null) {            map.put(tempNode, new RandomListNode(tempNode.label));            tempNode = tempNode.next;        }        tempNode = head;        while (tempNode != null) {            map.get(tempNode).next = map.get(tempNode.next);            map.get(tempNode).random = map.get(tempNode.random);            tempNode = tempNode.next;        }        return map.get(head);    }}
方法二:在每个节点后面插入一个一模一样的节点,再把这两个链表分开。代码如下:

/** * Definition for singly-linked list with a random pointer. * class RandomListNode { *     int label; *     RandomListNode next, random; *     RandomListNode(int x) { this.label = x; } * }; */public class Solution {    public RandomListNode copyRandomList(RandomListNode head) {        RandomListNode cur = head, next;        while(cur != null) {            next = cur.next;            RandomListNode node = new RandomListNode(cur.label);            node.next = next;            cur.next = node;            cur = next;        }        cur = head;        while(cur != null) {            if (cur.random != null)                cur.next.random = cur.random.next;            cur = cur.next.next;        }        cur = head;        RandomListNode reshead = new RandomListNode(0);        RandomListNode temp = reshead, tempNext;        while (cur != null) {            next = cur.next.next;            tempNext = cur.next;            temp.next = tempNext;            temp = tempNext;            cur.next = next;            cur = next;        }        return reshead.next;    }}

0 0