复杂链表的复制

复杂链表的复制

复杂链表定义: 在复杂链表中,每个节点除了有一个_pnext指针指向 下一个结点外,还有一个_pSibling指向链表的任意节点或者NULL.(如下图所示)

备注:橙黄箭头代表_pnext指针,深蓝箭头代表_pSibling指针。

任务一:创建复杂链表

//节点定义
struct ComplexListNode
{
	ComplexListNode(int x)
		:_value(x)
		,_pnext(NULL)
		,_pSibling(NULL)
	{}
    int _value;
	ComplexListNode *_pnext;
	ComplexListNode *_pSibling;
}*Phead;
//复杂链表简单创建
ComplexListNode* CreatList()
{
	ComplexListNode* head=new ComplexListNode(0);
	ComplexListNode* node1=new ComplexListNode(1);
	ComplexListNode* node2=new ComplexListNode(3);
	ComplexListNode* node3=new ComplexListNode(5);
	ComplexListNode* node4=new ComplexListNode(7);
	ComplexListNode* node5=new ComplexListNode(9);
	head=node1;
	node1->_pnext=node2;
	node2->_pnext=node3;
	node3->_pnext=node4;
	node4->_pnext=node5;
	node5->_pnext=NULL;
	node1->_pSibling=node3;
	node2->_pSibling=node5;
	node3->_pSibling=NULL;
	node4->_pSibling=node2;
	node5->_pSibling=NULL;
	return head;
}


任务二:创建新节点

思路:复制原来链表每个节点,并把每个新节点用_pnext指针将旧节点连接;如果原来链表的一个节点的_pSibling指向原链表某一个节点,则它对应的新节点的_pSibling指向某一节点的下一个节点。

//复制_pnext域
ComplexListNode*  CopyNodes(ComplexListNode* Phead)
{
	ComplexListNode* cur=Phead;
	while(cur)
	{
		ComplexListNode* copynode=new ComplexListNode(0);
		copynode->_value=cur->_value;
		if(cur->_pnext!=NULL)
		{
			copynode->_pnext=cur->_pnext;
		}
		else
		{
			copynode->_pnext=NULL;
		}
		copynode->_pSibling=NULL;
		cur->_pnext=copynode;
		
		cur=copynode->_pnext; 
	}
	return Phead;
}

//复制_pSibling域
ComplexListNode* CopySibNodes(ComplexListNode* Phead)
{
	ComplexListNode* cur=Phead;
	while(cur)
	{
		ComplexListNode* copynode=cur->_pnext;
		if(cur->_pSibling)   
		{
			copynode->_pSibling=cur->_pSibling->_pnext;
		}
		cur=copynode->_pnext;
	}
	return Phead;
}

任务三:长链表变成两个链表

ComplexListNode* CopyComplexList(ComplexListNode* Phead)
{
	ComplexListNode* cur=Phead;
	ComplexListNode* copynode=new ComplexListNode(0);
	ComplexListNode* Phead1=new ComplexListNode(0);
	if(cur!=NULL)
	{
		Phead1=copynode=cur->_pnext;
		cur->_pnext=copynode->_pnext;
		cur=cur->_pnext;
	}
	while(cur)
	{
		copynode->_pnext=cur->_pnext;   //关键1步
		copynode=copynode->_pnext;
		cur->_pnext=copynode->_pnext;
		cur=cur->_pnext;
	}
	return  Phead1;
}

就这样,复杂链表的复制完成了,小编要和大家说再见了!再见

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值