大家好,我是小单同学,欢迎交流指正~
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
🎁题目: 复杂链表的复制
方法1:构建一个拼接链表,每次new一个新的复制节点放到原链表对应节点的后面,为什么要这么做呢?因为这样每一个节点都是前一个节点的复制品,那么我们调整random指针的时候,只需要将random指针调整到对应节点的下一个位置即可。
/*
// 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 == nullptr)return nullptr;
Node* cur = head;
while(cur!=nullptr){
Node*tmp = new Node(cur->val);
tmp->next = cur->next;
cur->next = tmp;
cur = tmp -> next;
}
//修改random
cur = head;
while(cur!=nullptr){
if(cur->random!=nullptr){
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//拆分链表
Node*pre = head,*res = head->next;
cur = pre->next;
while(cur->next != nullptr){
pre->next = pre->next->next;
cur->next = cur->next->next;
pre = pre->next;
cur = cur->next;
}
//此时 pre 指向的next 仍然为复制链表的最后一个节点
//单独修改一下
pre->next = nullptr;
return res;
}
};
方法2 :(两种方法都直呼牛b,果然大佬就是大佬),用哈希表实现的map做一个映射(unordered_map)。
/*
// 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 == nullptr)return nullptr;
Node *cur = head;
unordered_map<Node*,Node*> hash;
//构建hash表
while(cur!=nullptr){
hash[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
while(cur != nullptr){
hash[cur]->next = hash[cur->next];
hash[cur]->random = hash[cur->random];
cur = cur->next;
}
return hash[head];
}
};