// 剑指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 面试题26 复杂链表的复制
最新推荐文章于 2016-08-25 10:20:41 发布