您的位置:首页 > 职场人生

面试题26_带随机指针的链表复制

2015-07-28 20:31 323 查看

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

解题思路

思路一:

分两步:第一步,遍历一遍链表,挨个复制;O(n)

第二步,遍历链表,挨个找随机指针,因为定位随机指针要从头开始,所以每一个节点的随机指针都要从头开始找;时间复杂度是:O(n^2)

总时间复杂度:O(n^2)

思路二:

分三步:

第一步:挨个复制,链接在原节点后面,例如:1->2->3->4,复制后:1->1->2->2->3->3->4->4。时间复杂度O(n)

第二步:挨个复制随机指针,将随机指针的指向设置好。时间复杂度O(n)

第三步:拆分成两个链表,注意编码细节 。时间复杂度O(n)

总时间复杂度:O(n)+O(n)+O(n) == O(n)

代码实现

/*
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 == nullptr)
return nullptr;

CloneNodes(pHead);
ConnectRandomList(pHead);
return DeconnectList(pHead);

}
//第一步复制节点
void CloneNodes(RandomListNode* pHead)
{
RandomListNode *pNode = pHead;
while(pNode != nullptr)
{
RandomListNode *pClone = new RandomListNode(0);
pClone->label = pNode->label;
pClone->next = pNode->next;
pClone->random = nullptr;
pNode->next = pClone;
pNode = pClone->next;
}
}
//第二步复制随机指针
void ConnectRandomList(RandomListNode *pHead)
{
RandomListNode *pNode = pHead;

while(pNode != nullptr)
{
RandomListNode *pClone = pNode->next;

if(pNode->random != nullptr)
{
pClone->random = pNode->random->next;
}

pNode = pClone->next;

}
}
//第三步拆分链表
RandomListNode* DeconnectList(RandomListNode *pHead)
{
RandomListNode *pNode = pHead;
RandomListNode *pCloneHead = nullptr;
RandomListNode *pCloneNode = nullptr;

if(pNode != nullptr)
{
pCloneHead = pNode->next;
pCloneNode = pNode->next;

pNode->next = pCloneNode->next;
pNode = pCloneNode->next;
}
//注意指针的指向 及 顺序
while(pNode != nullptr)
{
pCloneNode->next = pNode->next;
pCloneNode = pCloneNode->next;

pNode->next = pCloneNode->next;
pNode = pNode->next;
}

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