(1)根据原始链表的每个结点N创建对应的N,并且把N
链接在N的后面。
(2)设置复制出来的节点的m_pSibling
(3)把长链表拆分成两个链表
#include <iostream>
using namespace std;
struct ComplexListNode
{
ComplexListNode(int data)
:m_nValue(data)
,m_pNext(NULL)
,m_pSibling(NULL)
{}
ComplexListNode()
{}
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
//根据原始链表的每个结点N创建对应的N`,N`链接在N的后面
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while(pNode)
{
ComplexListNode* pCloned = new ComplexListNode();
pCloned->m_nValue = pNode->m_nValue;
pCloned->m_pNext = pNode->m_pNext;
pCloned->m_pSibling = NULL;
pNode->m_pNext = pCloned;
pNode = pCloned->m_pNext;
}
}
//设置复制出来的m_pSibling
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;
}
}
//把长链表拆分成两个链表:把奇数位置上的结点用m_pNext链接起来就是原始链表,
//偶数位置上的数就是复制出来的链表
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pClonedHead = NULL;
ComplexListNode* pCloneNode = NULL;
if(pNode)
{
pClonedHead = pCloneNode = pNode->m_pNext;
pNode->m_pNext = pCloneNode->m_pNext;
pNode = pNode->m_pNext;
}
while(pNode)
{
pCloneNode->m_pNext = pNode->m_pNext;
pCloneNode = pCloneNode->m_pNext;
pNode->m_pNext = pCloneNode->m_pNext;
pNode = pNode->m_pNext;
}
return pCloneNode;
}
//复杂链表的复制
ComplexListNode* Clone(ComplexListNode* pHead)
{
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
return ReconnectNodes(pHead);
}
int main()
{
ComplexListNode pHead1(1);
ComplexListNode pHead2(2);
ComplexListNode pHead3(3);
ComplexListNode pHead4(4);
ComplexListNode pHead5(5);
pHead1.m_pNext = &pHead2;
pHead1.m_pSibling = &pHead4;
pHead2.m_pNext = &pHead3;
pHead2.m_pSibling = &pHead5;
pHead3.m_pNext = &pHead4;
pHead3.m_pSibling = &pHead1;
pHead4.m_pNext = &pHead5;
pHead4.m_pSibling = &pHead2;
pHead5.m_pNext = NULL;
pHead5.m_pSibling = &pHead3;
Clone(&pHead1);
ComplexListNode* pHead = &pHead1;
while(pHead)
{
cout<<pHead->m_nValue<<" ";
pHead = pHead->m_pNext;
}
system("pause");
return 0;
}