【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
思路
第一步我们首先对每个结点进行复制,并让复制的结点链接在原结点的后面,先使其成为一条完整的链,如下所示
A->A‘->B->B‘->C->C‘
第二步我们就可以来拷贝其random指针了,我们知道原链结点和复制链的结点是间隔排布的,那么我们很容易找到其对应的关系,因为A‘的位置是A->next,假设A->random=C,那么也就可以得出A‘->RANDOM=C->next=A->random->next
第三步,由于此时我们已经完成了拷贝,我们所需要的就是将拷贝链提取出来,那么我们使用两个指针间隔移动即可
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { CloneNode(pHead); CloneRandom(pHead); return ReconnectNode(pHead); } void CloneNode(RandomListNode* head) { RandomListNode* pNode = head; while(pNode!=nullptr) { RandomListNode* pClone = new RandomListNode(0); pClone->label = pNode->label; pClone->next = pNode->next; pNode->next = pClone; pNode = pClone->next; } } void CloneRandom(RandomListNode* head) { RandomListNode* pNode = head; while(pNode!=nullptr) { RandomListNode* pClone = pNode->next; if(pNode->random!=nullptr) { pClone->random = pNode->random->next; } pNode = pClone->next; } } RandomListNode* ReconnectNode(RandomListNode* head) { RandomListNode* pNode = head; RandomListNode* pCloneHead = nullptr; RandomListNode* pCloneNode = nullptr; if(pNode!=nullptr) { pCloneHead = pCloneNode = pNode->next; pNode->next = pCloneNode->next; pNode = pNode->next; } while(pNode!=nullptr) { pCloneNode->next = pNode->next; pCloneNode = pCloneNode->next; pNode->next = pCloneNode->next; pNode = pNode->next; } return pCloneHead; } };
版权声明:本文为博主原创文章,如果转载,请注明出处
原文地址:http://blog.csdn.net/libin1105/article/details/48375517