class Solution {
public:
//此题分为 3 个步骤来对链表进行操作
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead)
return nullptr;
createNode(pHead);
connectRamdomPoint(pHead);
RandomListNode*p = cutOldList(pHead);
return p;
}private:
//增加新结点,并将其附在旧的结点的后面
void createNode(RandomListNode *pHead)
{
if(!pHead)
return;
RandomListNode * p = pHead;
while(p)
{
RandomListNode * newNode = new RandomListNode(p->label);
newNode->next = p->next;
p->next = newNode;
p = p->next->next;
}
}
//连接random指针
void connectRamdomPoint(RandomListNode *pHead)
{
if(!pHead)
return;
RandomListNode*p = pHead;
RandomListNode* pNext = p->next;
while(p)
{
if(p->random)
pNext->random = p->random->next;
else
pNext->random = nullptr;
p = pNext->next;
if(p)
pNext = p->next;
else
break;
}
}
//断开旧链表结点
RandomListNode * cutOldList(RandomListNode *pHead)
{
if(!pHead)
return nullptr;
RandomListNode*p = pHead;
RandomListNode* pNext = p->next;
RandomListNode* res = pNext; //结果的头节点
while(pNext)
{
p->next = pNext->next;
p = p->next;
if(p){
pNext->next = p->next;
pNext = pNext->next;
}
else{
pNext->next = p;
pNext = pNext->next;
}
}
return res;
}};

京公网安备 11010502036488号