题干:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点:注意此处这个任意一个节点也是属于这个链表中的,这句话很重要!),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:
这道题关键就是有两点:
1.绝对不能直接将引用指向原头节点:
RandomListNode node = pHead;
return node;
上面这样操作,会直接导致输出为空;
2.另外一个指针是指向任意节点,注意任意二字!!!甚至可能是指向自己!!!!
所以,这道题的思想核心就是利用HashMap完成新旧节点的映射关系,新建两个引用,一个负责插入key、value的映射对;而另外一个引用则是用来添加next、和random。具体见下:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.HashMap;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
RandomListNode p1 = pHead;
RandomListNode p2 = pHead;
while(p1!=null){
map.put(p1,new RandomListNode(p1.label));
p1=p1.next;
}
while(p2!=null){
if(p2.next!=null){
map.get(p2).next = map.get(p2.next);
}
else{
map.get(p2).next = null;
}
map.get(p2).random = map.get(p2.random);
p2=p2.next;
}
return map.get(pHead);
}
}