题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
步骤
1、复制旧的链表,每个节点都复制一份插入当前节点之后(random指针此时不赋值)
2、
给新链表的random指针复制,偶数节点需要复制。random指针指向前节点randon节点的下一个节点
3、将链表拆成两个,偶数节点即为需要的链表
/*
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* pMove = pHead;
if(pHead == NULL)
{
return NULL;
}
//step-1 复制旧链表
while(pMove != NULL)
{
RandomListNode* pTemp = new RandomListNode(pMove->label);
pTemp->next = pMove->next;
pMove->next = pTemp;
pMove = pTemp->next;
}
//step-2 给新链表的random指针赋值,偶数节点需要赋值
pMove = pHead;
while(pMove != NULL )
{
if(pMove->random)//这里记住要判断
{
pMove->next->random = pMove->random->next;
}
pMove = pMove->next->next;
}
//step-3 拆开新旧链表
RandomListNode* pNewHead = pHead->next;
pMove = pHead;
while(pMove->next != NULL)
{
RandomListNode* pTemp = pMove->next;
pMove->next = pTemp->next;
pMove = pTemp;
}
return pNewHead;
}
};