【剑指Offer】【链表】复杂链表的复制

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空

 

/*
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 == nullptr)
        {
            return nullptr;
        }
        //将链表每个结点复制一个克隆,放在该节点的后一位
        RandomListNode *pNode = pHead;
        while(pNode != nullptr)
        {
            RandomListNode *pClone = new RandomListNode(pNode->label);
            pClone->next = pNode->next;
            pClone->random = nullptr;
            
            pNode->next = pClone;
            pNode = pClone->next;
        }
        //设置克隆结点的random
        pNode = pHead;
        while(pNode != nullptr)
        {
            RandomListNode *pClone = pNode->next;
            if(pNode->random != nullptr)
            {
                pClone->random = pNode->random->next;
            }
            pNode = pClone->next;
        }
        //将链表拆分
        pNode = pHead;
        RandomListNode *pCloneHead = pHead->next;
        while(pNode->next != nullptr)
        {
            RandomListNode *ptmp = pNode->next;
            pNode->next = ptmp->next;
            pNode = ptmp;
        }
        return pCloneHead;
    }
};

  

 

 

posted @ 2019-08-30 12:56  XieXinBei0318  阅读(94)  评论(0编辑  收藏  举报