所有代码均通过G++编译器测试,仅为练手纪录。
//面试题26:复杂链表的复制
//题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。
// 在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。
//面试题26:复杂链表的复制
//题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。
// 在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。
struct ComplexListNode
{
int m_nValue;
ComplexListNode *m_pNext;
ComplexListNode *m_pSibling;
};
void CloneNodes(ComplexListNode *pHead)
{
ComplexListNode *pCurNode = pHead;
while (NULL != pCurNode)
{
ComplexListNode *pNode = new ComplexListNode;
pNode->m_nValue = pCurNode->m_nValue;
pNode->m_pNext = pCurNode->m_pNext;
pNode->m_pSibling = NULL;
pCurNode->m_pNext = pNode;
pCurNode = pNode->m_pNext;
}
}
void CloneSiblingNodes(ComplexListNode *pHead)
{
ComplexListNode *pCurNode = pHead;
while (NULL != pCurNode)
{
ComplexListNode *pNode = pCurNode->m_pNext;
if(NULL != pCurNode->m_pSibling)
{
pNode->m_pSibling = pCurNode->m_pSibling->m_pNext;
}
pCurNode = pNode->m_pNext;
}
}
ComplexListNode *SpliteNodes(ComplexListNode *pHead)
{
ComplexListNode *pCurNode = pHead;
ComplexListNode *pClonedHead = pCurNode->m_pNext;
ComplexListNode *pCloneNode = pCurNode->m_pNext;
while (NULL != pCurNode)
{
pCurNode->m_pNext = pCloneNode->m_pNext;
pCurNode = pCurNode->m_pNext;
pCloneNode->m_pNext = pCurNode->m_pNext;
pCloneNode = pCloneNode->m_pNext;
}
return pClonedHead;
}
ComplexListNode * Clone(ComplexListNode *pHead)
{
if(NULL == pHead)
{
return NULL;
}
CloneNodes(pHead);
SpliteNodes(pHead);
return SpliteNodes(pHead);
}
ZhaiPillary
2017-01-07