题目描述
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
解题思路
- 这是一个复杂的链表,由于可以随机指向任意节点,那么第1-》第5节点,此时还未知第五节点的情况——》说明遍历一次是不够的
- 原链表具有映射关系,但新链表创建后却难以找到了------->这种随机的映射关系可以通过HashMap来保存
- 采用HashMap来对应新旧链表的节点,那么对应的随机指向也就知道了
- Map<Node,Node> map = new HashMap<>();
- 第1个Node为旧,第2个Map为new Node(int val);
Java代码实现
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
// 使用HashMap建立新旧映射关系——>随机映射
if(head == null) return null;
//1. 遍历一遍得到原链表与现在新链表的映射
Map<Node,Node> map = new HashMap<>();
Node p = head;
while(p!=null){
map.put(p,new Node(p.val));
p = p.next;
}
// 2. 根据映射更新next节点和random指向
p = head;
while(p!=null){
map.get(p).next = map.get(p.next);
map.get(p).random = map.get(p.random);
p = p.next;
}
return map.get(head);
}
}