输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

用的书本上的算法:注意确定边界值

struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
class Solution {
public:
    //1.在原链表中插入复制链表并确定next指向
    void InsertIntoList(RandomListNode* pHead)
    {
        RandomListNode* p=pHead;
        while(p!=nullptr)
        {
            //新建一个节点
            RandomListNode* pClone=new RandomListNode(0);
            pClone->random=nullptr;
            pClone->label=p->label;
            pClone->next=p->next;
            p->next=pClone;
            p=pClone->next;
        }
    }

    //2.确定random指向
    void PutRandom(RandomListNode* pHead)
    {
        RandomListNode* p=pHead,*pClone=pHead->next;
        while(p!=nullptr&&pClone!=nullptr)
        {
            if(p->random)
            {
                pClone->random=p->random->next;
            }
            p=pClone->next;
            if(p!=nullptr)
                pClone=p->next;
        }
    }

    //3.拆分原链表和复制的链表
    RandomListNode* SplitList(RandomListNode* pHead)
    {
        RandomListNode* p=pHead,*pClone=p->next,*pCloneHead=pClone;
        while(pClone!=nullptr)
        {
            p->next=pClone->next;
            p=pClone->next;
            if(p==nullptr)
            {
                pClone->next=nullptr;
                break;
            }
            pClone->next=p->next;
            pClone=p->next;
        }
        return pCloneHead;
    }
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead==nullptr)
            return nullptr;
        InsertIntoList(pHead);
        PutRandom(pHead);
        RandomListNode* pCloneHead=SplitList(pHead);
        return pCloneHead;
    }
};