剑指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);
}
};
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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);
}
};
相关文章推荐
- 剑指offer—复杂链表的复制
- 剑指offer—复杂链表的复制
- 剑指Offer之面试题26:复杂链表的复制
- 剑指offer之二十一---复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer——复杂链表的复制_
- 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
- 【剑指Offer学习】【面试题26:复杂链表的复制】
- 剑指offer: 复杂链表的复制
- 剑指offer——面试题26:复杂链表的复制
- 【剑指offer】第三十四题(二叉树中和尾某一值的路径) 和 第三十五题(复杂链表的复制)
- 剑指offer面试题26:复杂链表的复制
- 剑指Offer——复杂链表的复制
- 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
- 剑指offer---复杂链表复制
- 【剑指Offer面试题】 九度OJ1524:复杂链表的复制
- 剑指offer:复杂链表的复制
- 剑指offer-面试题26 复杂链表的复制
- 剑指 offer代码解析——面试题26复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制