/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
//0.要考虑空节点,不写的话,程序就报错了。就会出现数组越界的情况!!!!!!!
if(pNode == nullptr) return nullptr;
//1.复制节点,插入到节点的后方
copyNode( pNode);
//2.还原原节点的random指针
restoreNodeRandom(pNode);
//3.拆分
return splitNode(pNode);
}
void copyNode(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
while(pNode != nullptr)
{
//1.1新建一个克隆节点
RandomListNode* pClone = new RandomListNode(pNode->label);
pClone->next = pNode->next;
pNode->next = pClone;
//1.2更新当前的节点
pNode = pClone->next;
}
}
void restoreNodeRandom(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
//进行循环判断
while(pNode != nullptr)
{
RandomListNode* pClone = pNode->next;
//2.1判断当前节点是否有random
if(pNode->random)
{
pClone->random = pNode->random->next;
}
//2.2更新当前的节点
pNode = pClone->next;
}
}
RandomListNode* splitNode(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
//result!!!!!
RandomListNode* result =pNode->next;
while(pNode != nullptr)
{
RandomListNode* pClone = pNode->next;
//拆分1.
pNode->next= pClone->next;
//更新当前节点
pNode = pNode->next;
//拆分2.
if(pNode)
{
pClone->next = pNode->next;
}
}
//返回的不是pClone!!!
return result;
}
};
35剑指OFFER之复杂链表的复制(比较有意思)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。