您的位置:首页 > Web前端

剑指offer 复杂链表的复制

2017-11-05 18:53 447 查看
题目:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

这题最开始没读懂什么意思,后来是看别人的题解解决的,题目其实就是字面意思,就是将这个带有random指针的链表复制一下,然后得到新链表的表头head。

思路:首先将链表复制一遍,将每个复制的节点紧跟着原节点。如下所示:



然后就是对random指针的设置,



其实我们可以发现A->next->random=A'->random=A->random->next,

那么最后就得到了复制链表,只不过最后复合在一起,将其抽离出来即可。抽离的时候要注意一个细节,那就是pNode指针一定要在pcloneNode节点的前方,不然可能指到空指针。代码:

/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
void CloneListNode(RandomListNode* pHead)
{
RandomListNode* p = pHead;
while(p)
{
RandomListNode* pNode = new RandomListNode(0);
pNode->label = p->label;
pNode->next = p->next;
p->next = pNode;
p = pNode->next;
}
}
/*A->A'->B->B'->C->C'*/
void CloneRandomNode(RandomListNode* pHead)
{
RandomListNode* p = pHead;
while(p)
{
RandomListNode* pClone = p->next;
if(p->random) pClone->random = p->random->next;
p = pClone->next;
}
}

RandomListNode* Split(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
RandomListNode* pCloneHead = pNode->next;
RandomListNode* pCloneNode = pCloneHead;
pNode->next = pCloneNode->next;
pNode = pCloneNode->next;
while(pNode)
{
pCloneNode->next = pNode->next;
pCloneNode = pNode->next;
pNode->next = pCloneNode->next;
pNode = pNode->next;
}
return pCloneHead;
}

RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead) return NULL;
CloneListNode(pHead);
CloneRandomNode(pHead);
return Split(pHead);
}
};

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: