题目要求
给一个链表,其中每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点,题目要求为返回这个链表的深拷贝(深拷贝即将链表完完全全复制下来,包括除链表结构外的随机指针)
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
解题思路
方法:
首先在各个元素后插入与自己相同的元素,并复制随机指针,将随机指针赋给与自己相同的数的 next,最后将这些插入元素进行拆分即可
解题演示
过程显示:
- 给定如图链表:
- 将链表加入元素,复制随机指针至以下状态,再进行拆分
解题代码
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == nullptr)
return head;
Node* node = head;
//复制
while (node != nullptr)
{
Node *copy = new Node(node->val, nullptr, nullptr);
copy->next = node->next;
node->next = copy;
node = copy->next;
}
node = head;
while (node != nullptr)
{
if (node->random != nullptr)
{
node->next->random = node->random->next;
}
node = node->next->next;
}
node = head;
Node *newHead = head->next;
Node *newNode = newHead;
//分离
while (node != nullptr)
{
node->next = node->next->next;
if (newNode->next != nullptr)
{
newNode->next = newNode->next->next;
}
node = node->next;
newNode = newNode->next;
}
return newHead;
}
};