JZ25复杂链表的复制
作者:互联网
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
分析:
“深拷贝”,意味着不能将该链表的每个节点的data,next,random拷贝在一个新的节点,那样新的链表的node.next指向的还是上面旧链表的一个节点【如下图】,所以进行深拷贝时不能简单的拷贝旧链表的每个节点。
思路:
将新旧节点的对应关系保存在Map中,分别对应key,value【如下图】
如图可以得到关系:
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
代码实现:
class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
public class Test25 {
public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null) return null;
HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
RandomListNode cur = pHead;
while(cur != null){
RandomListNode node = new RandomListNode(cur.label);
map.put(cur,node);
cur = cur.next;
}
//此时 已经将新老节点的对应关系保存到map中
cur = pHead;
while (cur !=null){
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
//循环结束,此时新的链表的 next 和 random 已经维护完成
return map.get(pHead);
}
}
标签:map,cur,get,JZ25,next,链表,复制,RandomListNode,节点 来源: https://blog.csdn.net/qq_45915957/article/details/116947048