1. 利用随即指针不管怎么指,指的永远是该列表的特性,保存一个node地址和位置索引得map。然后肯定要建立对于得vector保存新的节点,这样就可以在后于如果这个node有随机指针的话,方便找到那个元素,然后指向它。
  2. 以及其中用的新节点再次赋值的技巧。
  3. node_vec.push_back(NULL);// 放入最后的结尾NULL节点(方便node_vec[i]->next = node_vec[i+1];处理)
/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {

        if(!pHead) return NULL;

        RandomListNode* new_head = pHead;
        map<RandomListNode*,int> node_map;
        vector<RandomListNode*> node_vec;

        int i =0;//首先根据new_head 保存 新列表数组,且记录,地址以及对应得索引。(空节点没有push)
        while(new_head){
            node_vec.push_back(new RandomListNode(new_head->label));
            node_map[new_head] = i;//不管怎么random也是指向的也是本列表的元素

            new_head = new_head->next;
            i++;

        }

        //进行链接
        node_vec.push_back(NULL);// 放入最后的结尾NULL节点(方便node_vec[i]->next = node_vec[i+1];处理)
        new_head  = pHead;

        i = 0;
        while(new_head){
            node_vec[i]->next = node_vec[i+1];
            if(new_head->random){//并不是所有的node都有random指针
                node_vec[i]->random = node_vec[node_map[new_head->random]];
            }
            new_head = new_head->next;
            i++;

        }



        return node_vec[0];//返回新的头节点。

    }
};