复杂链表的复制
Posted vector6_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂链表的复制相关的知识,希望对你有一定的参考价值。
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
//1.遍历复制每个节点,将新节点插入旧节点后面,
//2.重新遍历将新节点的random指针指向正确的位置,现在由于新节点在旧节点之后,新节点random指针指向的位置即为旧节点random指针指向的下一位
//3.最后将新节点拆分为新链表
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead == nullptr)
return pHead;
RandomListNode* pCur = pHead;
while(pCur!=nullptr)
{
RandomListNode* pNew = new RandomListNode(pCur->label);
RandomListNode* pNext = pCur->next;
pCur->next = pNew;
pNew->next = pNext;
pCur = pNext;
}
pCur = pHead;
while(pCur!=nullptr)
{
pCur->next->random = pCur->random==nullptr?nullptr : pCur->random->next;
pCur = pCur->next->next;
}
pCur = pHead;
RandomListNode* pCloneHead = pHead->next;
while(pCur!=nullptr)
{
RandomListNode* pCloneNode = pCur->next;
pCur->next = pCloneNode->next;
pCloneNode->next = pCloneNode->next==nullptr ? nullptr : pCloneNode->next->next;
pCur = pCur->next;
}
return pCloneHead;
}
};
以上是关于复杂链表的复制的主要内容,如果未能解决你的问题,请参考以下文章