复杂链表

    在复杂链表中除了有一个_next域指向下一个结点之外,还有一个_Snext域指向链表中任意一个位置或者NULL

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

spacer.gif

wKioL1cQbMPgs2fOAAAxXlgYGXI342.png


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

wKiom1cQbAzhPiB7AABcFY9wp4Y020.png

分离

wKiom1cQbAvwHj0FAABNFY84tCI467.png

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);
}

j_0037.gif这样,就完成了复杂链表的复制