[leedcode 138] Copy List with Random Pointer

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.

/**
 * 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) {
        //剑指offer26题,p147
        if(head==null) return null;
        RandomListNode cur=head;
        while(cur!=null){//第一步,复制node节点N',放在原始节点N的后面
            RandomListNode newNode=new RandomListNode(cur.label);
            newNode.next=cur.next;
            cur.next=newNode;
            cur=newNode.next;
        }
        cur=head;
        while(cur!=null){//第二步,复制random指针
            if(cur.random!=null){
                cur.next.random=cur.random.next;
            }
            cur=cur.next.next;
        }
        cur=head;//第三步,把长链表拆分成两个链表,注意尾节点的处理方式
        RandomListNode res=head.next;
        RandomListNode pnode=res;
        while(cur!=null){
            cur.next=cur.next.next;
            cur=cur.next;
            if(pnode.next!=null)////尾节点
            pnode.next=pnode.next.next;
            pnode=pnode.next;
        }
        return res;
    }
}

 

posted @ 2015-07-26 19:53  ~每天进步一点点~  阅读(125)  评论(0编辑  收藏  举报