题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行复制,并返回复制后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
用一个 hashmap保存新旧链表节点的对应的结点关系
代码
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)
{
if(pHead==null) return null;
//创建一个hashmap
HashMap<RandomListNode,RandomListNode> map=new HashMap<>();
//定义复制后的链表表头cloneHead
RandomListNode cloneHead=new RandomListNode(pHead.label);
//辅助指针cur用来获取旧链表表头
RandomListNode cur=pHead;
//辅助指针p用来获取新链表表头
RandomListNode p=cloneHead;
//将值存入map
while(pHead!=null){
map.put(pHead,new RandomListNode(pHead.label));
pHead=pHead.next;
}
//通过移动辅助指针复制链表
while(cur!=null){
p.next=map.get(cur.next);
p.random=map.get(cur.random);
cur=cur.next;
p=p.next;
}
//返回新链表头指针
return cloneHead;
}
}
相似题
小红书笔试题:每K个一组反转链表