剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
思路:用HashMap去记录节点的信息,构建新的节点,映射到哈希表中的next以及random即可。
/*
// 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) {
if(head == null) return null;
// 遍历 将节点信息存储到Hashmap中
Node temp = head;
HashMap<Node,Node> hm = new HashMap<>();
// key -- 原节点 value -- 复制的新节点
while(temp!=null){
hm.put(temp,new Node(temp.val));
temp = temp.next;
}
// 开始复制
temp = head;
while(temp!=null){
// 复制next 以及 random
hm.get(temp).next = hm.get(temp.next);
hm.get(temp).random = hm.get(temp.random);
// 遍历 temp
temp = temp.next;
}
// 返回头节点
return hm.get(head);
}
}
需要对链表遍历两次,所以时间复杂度为2n,即O(n),用到hashmap,所以空间复杂度为O(n)