/*
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之复杂链表的复制(比较有意思)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...