有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。
structComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
#include <iostream>
using namespace std;
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
//1.对原始链表每个结点N进行复制记录为N',并将N'连接到N之后
void CloneNodes(ComplexNode * pHead)
{
ComplexNode * pNode=pHead;
while(pNode!=NULL)
{
//创建新的结点
ComplexNode * pClone=new ComplexNode();
//对结点内容进行复制
pClone->m_nValue=pNode->m_nValue;
pClone->m_pNext=pNode->m_pNext;
pClone->m_pSibling=NULL;
//将新的结点添加到当前结点之后
pNode->m_pNext=pClone;
//当前结点指向新节点的下一个结点即原始链表中下一个结点
pNode=pClone->m_pNext;
}
}
//2.对N'的m_pSibling进行赋值,原始链表上结点N的m_pSibling指向S的话,N'的m_pSibling指向S'
void ConnectSiblingNodes(ComplexNode * pHead)
{
ComplexNode * pNode=pHead;
while(pNode!=NULL)
{
//结点N'
ComplexNode * pClone=pNode->m_pNext;
//如果结点N的m_pSibling(指向S)不为空
if(pNode->m_pSibling!=NULL)
{
//将N'的m_pSibling指向S'
pClone->m_pSibling=pNode->m_pSibling->m_pNext;
}
pNode=pClone->m_pNext;
}
}
//3.拆分链表,将N和N'分开
ComplexNode * ReconnectNodes(ComplexNode * pHead)
{
ComplexNode * pNode=pHead;
ComplexNode * pCloneHead=NULL;
ComplexNode * pCloneNode=NULL;
if(pHead!=NULL)
{
//复制链表的头结点
pCloneHead=pHead->m_pNext;
//记录复制链表的当前结点
pCloneNode=pHead->m_pNext;
//将头结点从原始链表删除
pNode->m_pNext=pCloneHead->m_pNext;
pNode=pNode->m_pNext;
}
while(pNode!=NULL)
{
//将原始链表中的N'结点连接到赋值链表中
pCloneNode->m_pNext=pNode->m_pNext;
//记录当前的N'结点
pCloneNode=pCloneNode->m_pNext;
//将结点N'从原始链表删除
pNode->m_pNext=pCloneNode->m_pNext;
//下一个节点
pNode=pNode->m_pNext;
}
return pCloneHead;
}
//调用函数完成对复杂链表的复制
ComplexNode * Clone(ComplexNode * pHead)
{
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
return ReconnectNodes(pHead);
}