使用分治的方法,将整个过程分为三步:
第一步:将链表中的每一个节点N的后面插入一个与N相同的节点N’
第二步:将N’与N‘的m_pSibling 链接
即(N’->m_pSibling = N->m_pSibling->m_pNext )
第三步:将整个链表拆为两个部分
struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
//第一步将链表中的每一个节点后面链接一个相同的节点
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pCloned = new ComplexListNode();
pCloned->m_nValue = pNode->m_nValue;
pCloned->m_pNext = pNode->m_pNext;
pCloned->m_pSibling = nullptr;
pNode->m_pNext = pCloned;
pNode = pCloned->m_pNext;
}
}
//第二步 处理新节点的m_pSibling
void ConnectSibilingNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pCloned = pNode->m_pNext;
if (pNode->m_pSibling != nullptr)
{
pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
}
pNode = pCloned->m_pNext;
}
}
//第三步 将链表拆开
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pClonedHead = nullptr;
ComplexListNode* pClonedNode = nullptr;
if (pNode != nullptr)
{
pClonedHead =pClonedNode = pNode->m_pNext;
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}
while (pNode != nullptr)
{
pClonedNode->m_pNext = pNode->m_pNext;
pClonedNode = pClonedNode->m_pNext;
pNode->m_pNext = pClonedNode->m_pNext;
pNode = pNode->m_pNext;
}
return pClonedHead;
}
ComplexListNode* Cloned(ComplexListNode* pHead)
{
CloneNodes(pHead);
ConnectSibilingNodes(pHead);
return ReconnectNodes(pHead);
}