深拷贝:一定要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);
}
} 
京公网安备 11010502036488号