Amazon-Copy List with Random Poi

2018-05-07  本文已影响0人  海生2018

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.

Solution:

public RandomListNode copyRandomList(RandomListNode head) {
        if(head==null) return null;
        RandomListNode iter=head;
        while(iter!=null){
            RandomListNode copy=new RandomListNode(iter.label);
            copy.next=iter.next;
            iter.next=copy;
            
            iter=iter.next.next;
        }
        iter=head;
        while(iter!=null){
            if(iter.random!=null){
                iter.next.random=iter.random.next;
            }else{
                iter.next.random=null;
            }
            iter=iter.next.next;
        }
        
        RandomListNode dump=new RandomListNode(0);
        dump.next=head;
        iter=dump;
        while(head!=null){
            iter.next=head.next;
            head.next=iter.next.next;
            iter=iter.next;
            head=head.next;
        }
        iter.next=null;
        RandomListNode res=dump.next;
        dump.next=null;
        dump=null;
        return res;
        
    }

时间复杂度:O(n)
空间复杂度:O(n)

第一步复制每个节点,复制节点连在原节点后。第二步修改复制节点random指针。第三步拆分链表。题目里要求不能改动原链表,所以只能拆分并输出。虚拟头节点最好断开连接。我试过边拆分边修改random指针,其实这里有一个错误,就是并不知道random是不是指未拆分的节点,所以不能合并在一起遍历。
也可以用哈希表方式<RandomListNode,RandomListNode>,key是节点,value是random指针的值,可以递归,递归开始put节点,然后根据哈希表修改random指针,递归终止于null,空间复杂度是O(n)。

上一篇下一篇

猜你喜欢

热点阅读