/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    // step1: 生成新节点链接到原节点后面
    void clone_new_node_connect(RandomListNode* pHead) {
        RandomListNode* pNode = pHead;
        RandomListNode* pTmp = nullptr;
        while (pNode != nullptr) {
            pTmp = new RandomListNode(pNode->label);
            pTmp->next = pNode->next;
            pNode->next = pTmp;
            pNode = pTmp->next;
        }
    }

    // step2: 处理random节点
    void handle_random(RandomListNode* pHead) {
       RandomListNode* pNode = pHead;
       while (pNode != nullptr) {
            if (pNode->random) {
                // handle clone node's random point
                pNode->next->random = pNode->random->next;
            }
            pNode = pNode->next->next;  // 跳过clone节点
       }
       return;
    }

    // step3: 拆分链表, 返回clone节点
    RandomListNode* reconnect_list(RandomListNode* pHead) {
        RandomListNode* pNode = pHead;
        RandomListNode* pCloneHead = nullptr;
        RandomListNode* pCloneNode = nullptr;

        if (pNode != nullptr) {
            pCloneNode = pCloneHead = 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;
    }

    RandomListNode* Clone(RandomListNode* pHead) {
        clone_new_node_connect(pHead);
        handle_random(pHead);
        return reconnect_list(pHead);
    }

};