深拷贝:一定要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); } }