题目:
输入一个复杂链表(每个节点中又节点值,以及两个指针,一个指向下一个节点,一个指向任意节点)返回结果为复制后复杂链表的head。
解法:
(一)先复制每一个节点以及每一个节点的next指针,再从头遍历每一个节点,记录它们的random节点,再head遍历节点寻找random节点所在的位置。这样会用两个循环进行。时间复杂度o(n^2)
(二)1、先复制每一个节点以及每一个节点的next指针。
2、将新复制的链表与旧链表连接起来。例如原链表为a-b-c-d-e-f-g-NULL。复制后的链表为a'-b'-c'-d'-e'-f'-g'-NULL。
将新旧链表连接起来后的链表为a-a'-b-b'-c-c'-d-d'-e-e'-f-f'-g-g'-NULL.那么连接后的链表中存在的这样的一个关系。
a->random->next = a->next->random,其中a->next =a' 即 a'->random = a->random->next,即寻得a'
的random指针。
3、将新旧链表拆开即可。假设连接后的链表为a-a'-b-b'-c-c'-d-d'-e-e'-f-f'-g-g'-NULL,
从头开始遍历,让cur->next 指向cur->next->next即可。
代码如下:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead==NULL)
return NULL;
RandomListNode* cur =pHead;
while(cur!=NULL) // 复制next
{
RandomListNode* temp = new RandomListNode(cur->label);
temp->next = cur->next;
cur->next = temp;
cur = temp->next;
}
cur = pHead;
while(cur!=NULL) // 复制random
{
if(cur->random!=NULL)
cur->next->random = cur->random->next;
cur = cur->next->next;//注意此处,要写在if外面,当某个节点的random指向空的时候,cur仍然要继续前移
}
cur = pHead;
RandomListNode * newhead = cur->next;
while(cur->next!=NULL) //拆链表
{
RandomListNode* temp = cur->next;
cur->next = temp->next;
cur = temp;
}
return newhead;
}