1、题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
2、算法分析
本题是复制链表的复制。A链表 复制为B链表。
本题的链表有几个特点
①有2个指针,一个指针是next,指向的是下一个结点。一个是random指针,指向的是下一个随机结点。
②现在对真个链表进行复制,可以分为2个大部分。
第一个部分是复制链表的结点;第二部分是复制链表的指针。
使用Map集合做映射,key代表原链表的结点,value代表的是复制链表的对应的结点。
构建新链表的next,random指针。
具体看代码。
3、代码实现
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.*;
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null){
return null;
}
RandomListNode current = pHead;
// 定义map做映射
Map<RandomListNode,RandomListNode> map = new HashMap<>();
// 复制链表结点
while(current != null){
map.put(current,new RandomListNode(current.label));
current = current.next;
}
//复制链表指针方向
current = pHead;
while(current != null){
// 将新链表的当前结点指向下一个结点
map.get(current).next = map.get(current.next);
// 将新链表的随机结点指向下一个结点
map.get(current).random = map.get(current.random);
current = current.next;
}
//返回新链表的头结点。
return map.get(pHead);
}
}