文章目录
1.复制带随机指针的链表
解题思路: 采用原地复制的思想。时间复杂度:O(n) 空间复杂度:O(1)
- 复制节点,同时将复制节点链接到原节点后面,如A->B->C 变为 A->A’->B->B’->C->C’。
- 设置节点random值。
- 将复制链表从原链表分离。
/*
// 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;
}
};
*/
class Solution {
public:
void copyList(Node* head)
{
Node* node=head;
while(node!=nullptr) //复制出原链表的元素并将其放在原元素的后面,修改next指针
{
Node* newNode=new Node(node->val,nullptr,nullptr);
newNode->next=node->next;
node->next=newNode;
node=newNode->next;
}
node=head;
while(node!=nullptr) //修改每个复制元素的random指针
{
if(node->random!=nullptr)
{
node->next->random=node->random->next;
}
node=node->next->next;
}
}
Node* separateList(Node* head) //分离原链表和新链表,返回新链表头指针
{
Node* node=head;
Node* newNode=head->next;
Node* newHead=head->next;
while(node!=nullptr)
{
node->next=newNode->next;
if(newNode->next!=nullptr)
{
newNode->next=newNode->next->next;
newNode=newNode->next;
}
node=node->next;
}
return newHead;
}
Node* copyRandomList(Node* head) {
if(head==nullptr)
return head;
copyList(head);
Node* newHead=separateList(head);
return newHead;
}
};