浅拷贝就是两者共用一份内存地址,一个改变,另外一个跟着改变;深拷贝就是两者的内存地址是不一样的,互相独立的。
那么我们要怎么进行深拷贝呢?

肯定不可以直接将节点赋值给新的节点,这样就是引用了。所以我想到的是新建节点,然后新节点的值跟原来的节点的一样。
但是要怎么存储呢?因为我们深拷贝的新的链表,每一个节点都是跟原来链表一一对应的,但是是互相独立的,所以我就想到了HashMap,它不就是存储k-v键值对的吗,这样不就可以将两个节点一一对应起来。(这里的一一对应的意思是,知道哪个是哪个的深拷贝节点)
接着,我们还需要将新链表中的每个节点赋上next,random属性的值,那么我们就可以通过hashmap,通过key(原链表的节点),取出拷贝的节点,然后将这个key(旧节点)的两个属性值拷贝给新节点,这样不就很完美吗!

所以这道题就是看能不能想到用hashmap来解决了,当你想到的时候,那么一切问题将会变得非常的简单

public RandomListNode Clone(RandomListNode pHead)
    {
        HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
        RandomListNode p = pHead;
        //第一次遍历,新建立节点
        while(p != null){
            RandomListNode newNode = new RandomListNode(p.label);
            map.put(p,newNode);
            p = p.next;
        }

        p = pHead;
        //第二遍遍历 赋值对应的关系
        while(p != null){
            RandomListNode node = map.get(p);
            node.next = (p.next==null)?null:map.get(p.next);
            node.random = (p.random==null)?null:map.get(p.random);
            p = p.next;
        }
        return map.get(pHead);
    }