/*
p->next = r; // 带 -> 理解为指向 p结点 指向 r 结点 ,p 指针本身不变化
r = r->next; // 不带 -> 理解为赋值; r 代表 r的next  r 指针变化后移
};
重新声明空间构造,random 指向的结点 不容易找到。
在原有链表上先复制出新的节点,根据原有链表关系找到新复制的节点
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        if(!pHead) return NULL;
        RandomListNode *p = pHead;
        while(p){ // 所有结点复制一份,其复制的结点相邻;
            RandomListNode *tmp = new RandomListNode(p->label);
            tmp->next = p->next;
            p->next = tmp;
            p = tmp->next;
        }
        p = pHead;
        while(p){ // random 赋值
            if(p->random) p->next->random = p->random->next;
            p = p->next->next;
        }

        p = pHead->next;
        RandomListNode *aHead = pHead->next;
        while(p){ //生成的链表脱离
            RandomListNode *tmp = p->next->next;
            p->next = tmp;
            p = tmp;
        }
        return aHead;
    }
};