给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点
通过map建立新老节点的联系
class Solution {
public Node copyRandomList(Node head) {
if(head == null) return null;
HashMap<Node,Node> map = new HashMap<>();
Node cur = head;
while(cur != null) {
Node node = new Node(cur.val);//新的节点
map.put(cur,node);
cur = cur.next;
}
//cur == null 说明第一遍历结束了 map当中存储了x新老节点的映射关系
cur = head;
while(cur != null) {
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
//cur再次为空 此时说明 新的;链表的next和random已经维护完成
return map.get(head);
}
}