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; }
};