思路: 利用hash的k-v结构保存原节点和深克隆节点的映射关系
Code:
class Solution {
public Node copyRandomList(Node head) {
Node temp = head;
//创建map结构 k代表原来的节点 v代表深拷贝的节点
HashMap<Node, Node> map = new HashMap<Node, Node>();
//设置哨兵 完成深克隆链表的指向任务
Node dummy = new Node(-1);
while (temp != null) {
//创建深拷贝的节点
Node newNode;
if(!map.containsKey(temp)) {
//说明改点还没深拷贝过
newNode = new Node(temp.val);
//拷贝之后放到map中
map.put(temp, newNode);
} else {
//map中存在 直接拿
newNode = map.get(temp);
}
dummy.next = newNode;
if (temp.random != null) {
Node copyRandom;
//说明存在随机数指针 需要深拷贝随机数
if (!map.containsKey(temp.random)) {
copyRandom = new Node(temp.random.val);
map.put(temp.random, copyRandom);
} else {
//存在直接拿
copyRandom = map.get(temp.random);
}
//把random赋给 newNode
newNode.random = copyRandom;
}
dummy = newNode;
//向后遍历
temp = temp.next;
}
//直接返回head节点对应的深克隆节点
return map.get(head);
}
}