1、描述
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
来源:力扣(LeetCode)
链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
链表,赋值,多一个随机访问的指针,
3、思路
构造一个哈希表,键是原始链表的每个节点,值是新开辟空间创建出来的节点,遍历第一遍:构成一个哈希表,遍历第二遍根据 键 构造哈希表中新链表的两个指向。
4、notes
根据节点的构造函数构造新链表的每一个节点时,是用new关键字,根据构造函数在堆上初始化出来的。
5、复杂度
时间:O(N)两遍遍历链表
空间:O(N)新链表的长度
6、code
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if(!head) return nullptr;
unordered_map<Node* , Node*> mp;
auto cur = head;
while(cur){
//mp[cur] = cur;
mp[cur] = new Node(cur->val); // 在堆上搞一个新的节点,
cur = cur->next;
}
cur = head;
// 拷贝,
while(cur){
mp[cur]->next = mp[cur->next];
mp[cur]->random = mp[cur->random];
cur = cur->next;
}
return mp[head];
}
};