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

剑指offer 面试题26 复杂链表的复制

2016-07-04 07:54 656 查看
// 剑指offer 面试题26 复杂链表的复制
#include <iostream>
using namespace std;

struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;

ComplexListNode(){m_nValue = 0; m_pNext = NULL; m_pSibling = NULL;}
ComplexListNode(int value){m_nValue = value; m_pNext = NULL; m_pSibling = NULL;}

};

/*不借助辅助空间的情况下实现O(n)的时间效率*/

// 第一步,根据原始链表的每个节点N,复制出N',把N'链接在对应的N后面
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while(pNode)
{
ComplexListNode* pCloned = new ComplexListNode();
pCloned->m_nValue = pNode->m_nValue;
// 先保存原来的N节点的next指针
pCloned->m_pNext = pNode->m_pNext;
// 不复制sibling指针
pCloned->m_pSibling = NULL;
pNode->m_pNext = pCloned;
pNode = pCloned->m_pNext;
}
}

// 第二步,设置复制出来的节点的sibling指针
// 若原始链表上的N的sibling指针指向S,则复制出来的N指向S的next指向的节点S'
void ConnectSiblingNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while(pNode)
{
ComplexListNode* pCloned = pNode->m_pNext;
if(pNode->m_pSibling)
{
pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
}
pNode = pCloned->m_pNext;
}
}

// 第3步,拆分链表,奇数位置的节点用next连接起来就是原始链表
// 偶数位置的节点用next链接起来就是复制出来的链表。

ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
// 用于返回
ComplexListNode* pClonedHead = NULL;

ComplexListNode* pNode = pHead;
ComplexListNode* pClonedNode = NULL;

if(pNode)
{
// 找到复制的链表头,更新当前复制链表节点
pClonedHead = pClonedNode = pNode->m_pNext;

// 重连原始链表,更新当前原始链表节点
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}

while(pNode)
{
pClonedNode->m_pNext = pNode->m_pNext;
pClonedNode = pClonedNode->m_pNext;
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}
return pClonedHead;

}

ComplexListNode* clone(ComplexListNode* pHead)
{
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
return ReconnectNodes(pHead);
}

int main()
{
ComplexListNode* p1 = new ComplexListNode(1);
ComplexListNode* p2 = new ComplexListNode(2);
ComplexListNode* p3 = new ComplexListNode(3);
ComplexListNode* p4 = new ComplexListNode(4);
ComplexListNode* p5 = new ComplexListNode(5);
p1->m_pSibling = p3;
p2->m_pSibling = p5;
p4->m_pSibling = p2;
p1->m_pNext = p2;
p2->m_pNext = p3;
p3->m_pNext = p4;
p4->m_pNext = p5;

ComplexListNode* pClonedList = clone(p1);

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