您的位置:首页 > 其它

数据流补全脚本

2015-11-30 09:46 246 查看
复杂链表
在复杂链表中除了有一个_next域指向下一个结点之外,还有一个_Snext域指向链表中任意一个位置或者NULL

分析:A->B->C->D->E链表







将每个结点后克隆一个结点



分离



struct ComplexNode
{
int _data;
ComplexNode* _next;
ComplexNode* _Snext;
};
//把克隆的结点放到原结点后面
void CloneNodes(ComplexNode* pHead)
{
ComplexNode* pNode = pHead;

while (pNode != NULL)
{
ComplexNode* pCloneNode=new ComplexNode();//创建一个克隆的结点
pCloneNode->_data = pNode->_data;//得到原结点的值
pCloneNode->_next = pNode->_next;//用克隆的结点保存原结点的指向
pCloneNode->_Snext = NULL;//把克隆结点的随意的指针赋空
pNode->_next = pCloneNode;//把克隆的结点放到原结点的后面
pNode = pCloneNode->_next;//循环
}
}
//复制链表上的_Snext
void ConnectSNodes(ComplexNode*pHead)
{
ComplexNode*pNode = pHead;

while (pNode != NULL)//当结点不为空时进行结点的复制
{
ComplexNode* pCloneNode = pNode->_next;//指针指向结点的下一个(即克隆的结点)
if (pNode->_Snext != NULL)//当pNode的_Snext不为空将克隆结点的_Snext指向pNode的_Snext的下一个(即克隆结点指向克隆结点)
{
pCloneNode->_Snext = pNode->_Snext->_next;
}
pNode = pCloneNode->_next;//循环
}
}
//拆分链表,奇数即原链表,偶数即克隆链表
ComplexNode*ReconnectNodes(ComplexNode*pHead)
{
ComplexNode*pNode = pHead;
ComplexNode*pCloneNode = NULL;
ComplexNode*pCloneHead = NULL;

if (pNode != NULL)
{
pCloneNode = pCloneHead = pNode->_next;//得到克隆链表的头结点
pNode->_next = pCloneNode->_next;//分离
pNode = pNode->_next;//指向原头结点的下一个原结点
}
while (pNode!=NULL)//分离
{
pCloneNode->_next = pNode->_next;
pCloneNode = pCloneNode->_next;

pNode->_next = pCloneNode->_next;
pNode = pNode->_next;
}
return pCloneHead;
}
ComplexNode*Clone(ComplexNode*pHead)//复杂链表的复制
{
CloneNodes(pHead);
ConnectSNodes(pHead);
return ReconnectNodes(pHead);
}


这样,就完成了复杂链表的复制
本文出自 “无以伦比的暖阳” 博客,请务必保留此出处http://10797127.blog.51cto.com/10787127/1764101
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: