[LeetCode] Copy List with Random Pointer

来源:互联网 发布:网络布线施工报价单 编辑:程序博客网 时间:2024/06/14 19:18

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.

最简单的方法是参照clone graph,利用一个HashMap来存储已经访问过的Node。

不使用额外空间的话,可以把复制的node放在原来node之后(第一次遍历)。再把random pointer设到对应的copy node (第二次遍历)。最后还原原来的list和复制的list(第三次遍历)。

/** * 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) {        if(head == null)            return null;                    RandomListNode cur = head;                //copy the list, the copied node is appended to its orginal node        while(cur != null){            RandomListNode next = cur.next;            RandomListNode copyNode = new RandomListNode(cur.label);            cur.next = copyNode;            copyNode.next = next;            cur = next;        }                //copy random pointer        cur = head;        while(cur != null){            if(cur.random == null)                cur.next.random = null;            else {                cur.next.random = cur.random.next;            }            cur = cur.next.next;        }                //reorder the list        RandomListNode newListHead = head.next;        RandomListNode newListCur = newListHead;        cur = head;        while(cur != null){            RandomListNode next = cur.next.next;            cur.next = next;            cur = next;                        if(next != null){                RandomListNode newListNext = newListCur.next.next;                newListCur.next = newListNext;                newListCur = newListNext;            }        }                return newListHead;    }}


0 0
原创粉丝点击