给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
/*
// Definition for a Node.
class Node {
public int val;
public Node next;
public Node random;
public Node() {}
public Node(int _val,Node _next,Node _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public Node copyRandomList(Node head) {
if (head == null)
return null;
LinkedList<Node> list = new LinkedList<>();
HashMap<Node, Node> map = new HashMap<>();
Node node = head;
while (node != null) {
Node temp = new Node(node.val, node.next, node.random);
map.put(node, temp);
node = node.next;
}
for (Node n : map.keySet()) {
Node temp = map.get(n);
temp.next = map.get(n.next);
temp.random = map.get(n.random);
}
return map.get(head);
}
}
class Solution {
public Node copyRandomList(Node head) {
if (head == null)
return null;
Node node = head;
while (node != null) {
Node temp = new Node(node.val, node.next, node.random);
node.next = temp;
node = temp.next;
}
node = head;
Node copyHead = head.next;
while (node != null) {
Node temp = node.next;
if (temp.random != null) {
temp.random = temp.random.next;
}
node = node.next.next;
}
node = head;
while (node != null) {
Node temp = node.next;
node.next = temp.next;
node = node.next;
if (node != null)
temp.next = node.next;
else
temp.next = null;
}
return copyHead;
}
}
原文:https://www.cnblogs.com/WeichengDDD/p/10759066.html