深拷贝:一定要New一个新的对象,即在内存中有一个新的地址,将引用值的内容复制到新的地址中去;
通俗来说,你有一把房子的钥匙,我也有一把房子的钥匙,深拷贝就是我建一个和你一模一样的房子,里面所有的内容都一模一样,但是我们的钥匙是不一样的(这里的钥匙就是内存中的地址)
深拷贝,里面对对象做出改变对原来的引用值是没有影响的,毕竟我的房子和你的房子一模一样,但是终究是两个房子。

所以,重要要做到的第一步就是,没一个节点都要是新建的对象,这样才是深拷贝,这是第一步,现将每个节点建立出来;
第二步,因为每个节点的随机指针是指向随机的,那么只有所有节点都建好了,才能建立随机指针域,因此需要第二遍遍历。

代码如下:
import java.util.HashMap;
//使用哈希表存储旧链表与新链表之间的关系
//深拷贝,每个节点的地址都要与原来的地址不同,那每一个节点都需要重新创建
//由于每个节点所指向的随机节点是随机的,那一遍遍历链表是不够的,需要多次遍历链表
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        HashMap<RandomListNode,RandomListNode> list = new HashMap<RandomListNode,RandomListNode>();
        RandomListNode p = pHead;
        while(p != null ){
           RandomListNode newNode =  new RandomListNode(p.label);//映射关系,返回的是新建节点的地址
           list.put(p,newNode);
           p = p.next;
        }
        p = pHead;
        while(p != null){
            RandomListNode newNode = list.get(p);
            newNode.next = list.get(p.next) == null ? null : list.get(p.next); 
            newNode.random = list.get(p.random) == null ? null : list.get(p.random); 
            p = p.next;
        }
        return list.get(pHead);
    }
}