复杂链表的复制

来源:互联网 发布:js字符串去掉换行符 编辑:程序博客网 时间:2024/06/05 11:50

解题思路:

过程分为三步:
首先,遍历链表,复制当前结点currentNode对应的结点cloneCurNode,并将cloneCurNode放置在currentNode的后面,这样就形成一条包含原始链以及复制链的长链。

这里写图片描述

然后,还需将原始链中指针的方向赋予复制链

这里写图片描述

最后,将长链拆分,就得到原始链和复制链了。
这里写图片描述

/*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* pNode = pHead;        RandomListNode* nextNode = pNode->next;        while(pNode)        {            RandomListNode* temp = new RandomListNode(pNode->label);            pNode->next = temp;            temp->next = nextNode;            pNode = temp->next;            if(pNode)                         //处理本身链表只有一个结点和遍历到最后一个节点的情况            {                nextNode = pNode->next;                  }        }        pNode = pHead;         //开始处理随机指针        while(pNode)        {            if(!pNode->random)            {                pNode->next->random = NULL;            }               else                 pNode->next->random = pNode->random->next;            pNode = pNode->next->next;        }        //开始拆分链表        RandomListNode* CloneList = pHead->next;        RandomListNode* CloneNode = CloneList;        pNode = pHead;        while(pNode)        {            pNode->next = CloneNode->next;            pNode = pNode->next;            if(pNode)   //处理链表只有一个节点和到最后一个节点            {                CloneNode->next = pNode->next;                   CloneNode = CloneNode->next;            }        }        return CloneList;    }};
原创粉丝点击