解题思路
先遍历一遍链表,克隆出一条没有随即指针的新链表,期间记录(Map<源节点, 克隆节点>)
每个节点与其克隆的新节点
再遍历一遍链表,根据旧节点的随即指针给新节点的随机指针复制clone.get(cur).random = clone.get(cur.random)
代码
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Map<Node, Node> clone = new HashMap<>();
Node cur = head;
clone.put(cur, new Node(cur.val));
Node preClone = clone.get(cur);
while (cur.next != null) {
cur = cur.next;
Node node = new Node(cur.val);
clone.put(cur, node);
preClone.next = node;
preClone = preClone.next;
}
// 上面完成了没有连接random的克隆链表
cur = head;
while (cur != null) {
clone.get(cur).random = clone.get(cur.random);
cur = cur.next;
}
return clone.get(head);
}
}