题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目链接
解题思路
由于题目的链表中是有随机指针的,那么这时,再去使用链表的顺序访问,就比较费事了,这里我使用的是键值对的方式,第一次先把整个链表节点依次对应放进去,然后就可以根据旧的节点找到新节点,这时,只需要再次遍历就链表的每一个节点,将next和random连接上就可以了。
代码示例
import java.util.HashMap;
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
for(RandomListNode cur=pHead;cur!=null;cur=cur.next){
map.put(cur,new RandomListNode(cur.label));
}
for(RandomListNode old=pHead;old!=null;old=old.next){
RandomListNode ne = map.get(old);
RandomListNode nextN = map.get(old.next);
ne.next=nextN;
RandomListNode rand = map.get(old.random);
ne.random=rand;
}
return map.get(pHead);
}
}