给你一个长度为
n
的链表,每个节点包含一个额外增加的随机指针random
,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝 。 深拷贝应该正好由
n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next
指针和random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。
解:哈希表,可以先按照next指针的顺序先构造一个新链表,在构造的过程中,将原来的节点和其对应复制的新节点利用哈希表一一对应,然后之后遍历每个原始节点的random节点就能够找到新节点。
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) {
Node pre = new Node(0);
Node cur = head;
Node new_node = pre;
HashMap<Node, Node> map = new HashMap<>(); // 用于映射<原节点,新节点>
while(cur != null){
new_node.next = new Node(cur.val);
new_node = new_node.next;
map.put(cur, new_node); // 映射
cur = cur.next;
}
cur = head;
new_node = pre.next;
while(cur != null){
if(cur.random != null){
new_node.random = map.get(cur.random);
}
cur = cur.next;
new_node = new_node.next;
}
return pre.next;
}
}