/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        
         if(pHead == null) return pHead;
        // 1.将拷贝节点放到原节点后面,例如1->2->3这样的链表就变成了这样1->1'->2->2'->3->3'
        for (RandomListNode p = pHead, copy = null;     p != null; p = p.next.next) {
            copy = new RandomListNode(p.label);
            copy.next = p.next;
            p.next = copy;
        }
        // 2.把拷贝节点的random指针安排上
        for (RandomListNode p = pHead;                   p != null; p = p.next.next) {
            if (p.random != null) {
                p.next.random = p.random.next;
            }
        }
        // 3.分离拷贝节点和原节点,变成1->2->3和1'->2'->3'两个链表,后者就是答案
        RandomListNode newHead = pHead.next;
        for (RandomListNode p = pHead, temp = null;      p != null && p.next != null;) {
            temp = p.next;
            p.next = temp.next;
            p = temp;
        }
        
        
        
        return newHead;
        
        
        
        
        
        
        
    }
    
    
//     private void clone(RandomListNode pHead){
//         RandomListNode p = pHead;
//         while(p!=null){
//             RandomListNode clone= new RandomListNode(p.label);
//             clone.next=p.next;
//             clone.random=null;
//             p.next=clone;
//             p=clone.next;
//         }
//     }
    
    
//     private void cloneRandom(RandomListNode pHead){
//         RandomListNode p = pHead;
//         while(p!=null){
//             RandomListNode clone= p.next;
            
//             if(p.random!=null){
//                 clone.random=p.random.next;
//             }
//             p=clone.next;
                
            
//         }
//     }
    
//     private RandomListNode divide(RandomListNode head){
//         RandomListNode cloneNode = head.next;
//         RandomListNode cloneHead = cloneNode;
//         head.next=cloneNode;
//         head=head.next;
//         while(head!=null){
//             cloneNode.next=head.next;
//             head.next=head.next.next;
//             head=head.next;
//             cloneNode=cloneNode.next;
//         }
        
//         return cloneHead;
        
//     }
    
    
    
    
    
    
    
    
}