题目描述:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路:

对于深拷贝:利用HashMap来存放节点以及节点值:即遍历链表,然后将其节点以及节点值put进HashMap;然后通过移动链表将获取的节点复制到另一个链表中

public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead==null){
            return null;
        }
        //创建一个node节点用来存放返回拷贝后的节点,需要new()
        RandomListNode node=new RandomListNode(pHead.label);
        //当前节点链表
        RandomListNode current=pHead;
        //拷贝后节点链表
        RandomListNode copyCurrent=node;
        //用来存放每个节点及对应的节点值
        HashMap<RandomListNode,RandomListNode> map=new HashMap<>();
        //遍历当前链表,并将数据存放到map中
        while(pHead!=null){
            map.put(pHead,new RandomListNode(pHead.label));
            pHead=pHead.next;
        }
        //通过移动当前链表进行深拷贝
        while(current!=null){
            copyCurrent.next=map.get(current.next);
            copyCurrent.random=map.get(current.random);
            current=current.next;
            copyCurrent=copyCurrent.next;
        }
        //返回深拷贝后的头节点
        return node;
    }
}

为什么不返回copyCurrent,是因为copyCurrent这个在移动,最后会指向null
拓展学习:
首先来了解一下内存分区:
图片说明
其次我们需要了解一下基本类型与引用类型得区别:

基本类型:

就是值类型,即变量所对应得内存区域存储的是值

引用类型:

就是地址类型,真正的数据存储在地址对应的内存区域里面

浅拷贝:

只是将数据中所有的数据引用下来,依旧指向同一个存放地址,拷贝之后的数据修改之后,也会影响到原数据的中的对象数据

深拷贝:(引用类型需要new())

将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据