剑指offer题目25:复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
解答思路
如图是1个复杂链表的结构
正常的解答思路是先复制一遍链表,链表用next指针连起来,第二步再复制random指针。
解答的方法很是巧妙,分成三步。
-
复制链表而且和旧的链表连在一起。
-
使复制的链表指向原链表指向的节点的后1个节点,也就是random该指向的地方。
-
拆分链表为原链表和复制后的链表
实现代码
/*
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 == NULL) {
return NULL;
}
RandomListNode* pNode = pHead;
// 第一步 复制链表连在一起
while(pNode) {
RandomListNode* pNodeCopy = new RandomListNode(pNode->label);
pNodeCopy->next = pNode->next;
pNode->next = pNodeCopy;
pNode = pNodeCopy->next;
}
// 第二步 复制链表的随机指针
pNode = pHead;
while(pNode) {
pNode->next->random = pNode->random==NULL?NULL:pNode->random->next;
pNode = pNode->next->next;
}
// 第三步 拆分链表
pNode = pHead;
RandomListNode* pHeadCopy = pHead->next;
while(pNode) {
RandomListNode* pNodeCopy = pNode->next;
pNode->next = pNodeCopy->next;
pNodeCopy->next = pNodeCopy->next==NULL?NULL:pNodeCopy->next->next;
pNode = pNode->next;
}
return pHeadCopy;
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。