原地进行复制:时间复杂度O(n),空间复杂度O(1)
第一步:将链表节点复制,并将其链接 eg:1->2->3->4---------1->1->2->2->3->3->4->4
第二步:将自由链接进行链接,N->S可转化为N->N’------>S->S’
第三步:将原节点与复制节点分开,奇节点链接起来,偶节点链接起来
/*
// 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) {
CloneNodes(head);
connectRandomNodes(head);
return ReConnectNodes(head);
}
void CloneNodes(Node*head)
{
Node*pNode=head;
while(pNode!=nullptr)
{
Node*pCloneNode=new Node(pNode->val);
pCloneNode->next=pNode->next;
pCloneNode->random=nullptr;
pNode->next=pCloneNode;
pNode=pCloneNode->next;
}
}
void connectRandomNodes(Node*head)
{
Node*pNode=head;
while(pNode!=nullptr)
{
Node*pCloned=pNode->next;
if(pNode->random!=nullptr)
{
pCloned->random=pNode->random->next;
}
pNode=pCloned->next;
}
}
Node*ReConnectNodes(Node*head)
{
Node*pNode=head;
Node*pCloneHead=nullptr;
Node*pCloneNode=nullptr;
if(pNode!=nullptr)
{
pCloneHead=pCloneNode=pNode->next;
pNode->next=pCloneNode->next;
pNode=pNode->next;
}
while(pNode!=nullptr)
{
pCloneNode->next=pNode->next;
pCloneNode=pCloneNode->next;
pNode->next=pCloneNode->next;
pNode=pNode->next;
}
return pCloneHead;
}
};