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

};