面试题26:复杂链表的赋值

有一个复杂链表,其结点除了有一个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);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值