链接:力扣
题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例:
思路:
第一步:复制节点
例在A、B节点中间插入一个节点A',类似的创建B'、C' 。然后A -> A' -> B -> B' -> C -> C' -> NULL 连接起来。random同样复制,比如A -> random = C可以复制为A' -> random = C'
第二步:构建链路
删除A -> A'之间的链接,并且创建A' -> B',恢复A -> A。
【注意】这里的判断条件为复制链表的最后一个节点是不是指向空。
代码:
/*
// Definition for a Node.
class Node {
public: q q
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* node = head;
while (node) {
Node* p = new Node(node->val);
p->next = node->next;
node->next = p;
node = node->next->next;
}
node = head;
while (node) {
if (node->random) { //注意random可能不存在
node->next->random = node->random->next;
}
node = node->next->next;
}
Node* p1 = head;
Node* p2 = head->next;
Node* res = p2;
while (p2->next) { // 最后一个点用复制链表的来判断
p1->next = p2->next;
p2->next = p1->next->next;
p1 = p1->next;
p2 = p2->next;
}
p1->next = nullptr;
return res;
}
};