剑指offer 复杂链表的复制

来源:互联网 发布:网络优化教程 编辑:程序博客网 时间:2024/06/05 04:40

题目:

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

这题最开始没读懂什么意思,后来是看别人的题解解决的,题目其实就是字面意思,就是将这个带有random指针的链表复制一下,然后得到新链表的表头head。

思路:首先将链表复制一遍,将每个复制的节点紧跟着原节点。如下所示:


然后就是对random指针的设置,


其实我们可以发现A->next->random=A'->random=A->random->next,

那么最后就得到了复制链表,只不过最后复合在一起,将其抽离出来即可。抽离的时候要注意一个细节,那就是pNode指针一定要在pcloneNode节点的前方,不然可能指到空指针。代码:

/*struct RandomListNode {    int label;    struct RandomListNode *next, *random;    RandomListNode(int x) :            label(x), next(NULL), random(NULL) {    }};*/class Solution {public:    void CloneListNode(RandomListNode* pHead)    {        RandomListNode* p = pHead;        while(p)        {            RandomListNode* pNode = new RandomListNode(0);            pNode->label = p->label;            pNode->next = p->next;            p->next = pNode;            p = pNode->next;        }    }    /*A->A'->B->B'->C->C'*/    void CloneRandomNode(RandomListNode* pHead)    {        RandomListNode* p = pHead;        while(p)        {            RandomListNode* pClone = p->next;            if(p->random)  pClone->random  = p->random->next;            p = pClone->next;        }    }            RandomListNode* Split(RandomListNode* pHead)    {         RandomListNode* pNode = pHead;         RandomListNode* pCloneHead = pNode->next;         RandomListNode* pCloneNode = pCloneHead;         pNode->next = pCloneNode->next;         pNode = pCloneNode->next;         while(pNode)         {                  pCloneNode->next = pNode->next;             pCloneNode = pNode->next;             pNode->next = pCloneNode->next;             pNode = pNode->next;         }        return pCloneHead;    }        RandomListNode* Clone(RandomListNode* pHead)    {         if(!pHead)  return NULL;         CloneListNode(pHead);         CloneRandomNode(pHead);         return Split(pHead);    }};



原创粉丝点击