请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
哼,不能一次性对的我
/*
// 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) {
map<Node*, Node*> rel;
Node* nh = nullptr, *p = head, *m = nullptr;
if(!head)
return nullptr;
while(p) {
rel[p] = new Node(p->val);
p = p->next;
}
p = head;
while(p) {
rel[p]->next = rel[p->next];
rel[p]->random = rel[p->random];
if(!nh) {
nh = rel[p];
m = nh;
} else {
m->next = rel[p];
m = m->next;
}
p = p->next;
}
return nh;
}
};
/*
// 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) {
Node *p, *nh = nullptr, *m = nullptr;
if(!head)
return nullptr;
p = head;
while(p) {
Node *q = new Node(p->val);
q->next = p->next;
p->next = q;
p = q->next;
}
p = head;
while(p) {
Node* q = p->next;
if(p->random) {
q->random = p->random->next;
}
p = q->next;
}
p = head;
while(p) {
if(!nh) {
nh = p->next;
m = nh;
} else {
m->next = p->next;
m = m->next;
}
p->next = p->next->next;
p = p->next;
}
return nh;
}
};