复杂链表的复制

复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。

//ps: 复杂链表的结构
struct ComplexNode
{
int data ; // 数据
struct ComplexNode *next; // 指向下一个节点的指针
struct ComplexNode *random; // 指向随机节点(可以是链表中的任意节点 or 空)
}; 




思路:

1.在每个节点后面copy一个一模一样的节点,构成一个新链

2.plist中每个节点random后面的那个节点,就是他复制品的random

3.把复制品从原链表中提取出来即为所求




代码如下:

struct ComplexNode 
{ 
	int data ; // 数据 
	struct ComplexNode * next; // 指向下一个节点的指针 
	struct ComplexNode * random; // 指向随机节点(可以是链表中的任意节点 or 空) 
}; 

//复杂链表的复制。
//一个链表的每个节点,有一个指向next指针指向下一个节点,
//还有一个random指针指向这个链表中的一个随机节点或者NULL,
//现在要求实现复制这个链表,返回复制后的新链表

ComplexNode* BuyNode(int data);				//创建节点
ComplexNode* CopyComplexNode(ComplexNode* plist);	//复制
void Print(ComplexNode* plist);				//打印


ComplexNode* BuyNode(int data)
{
	ComplexNode* p = (ComplexNode*)malloc(sizeof(ComplexNode));
	p->data = data;
	p->next = NULL;
	p->random = NULL;
	return p;
}

ComplexNode* CopyComplexNode(ComplexNode* plist)
{
	ComplexNode* cur = plist;
	
	if(plist == NULL)
	{
		return NULL;
	}

	else if(plist->next == NULL)
	{
		return BuyNode(plist->data);
	}
	
	else
	{
		//每个节点后面插入相同的节点
		while (cur)
		{
			ComplexNode* tmp = BuyNode(cur->data);
			tmp->next = cur->next;
			cur->next = tmp;

			//cur每次往后移2个,因为整个链表是偶数个节点所以不会跳到NULL后面
			cur = tmp->next;	
		}

		//求复制品的random
		//*注意:分类讨论,random为空或不为空
		cur = plist;
		while(cur)
		{
			//如果当前random为空,复制品的random也是空
			//否则复制品的random,指向当前节点random的下一个节点(这里忘了分类会挂掉)
			if(cur->random == NULL)
			{
				cur->next->random = NULL;
			}
			else
			{
				cur->next->random = cur->random->next;
			}
			cur = cur->next->next;
		}

		//复制品提取构成新链表
		ComplexNode* newlist = plist->next;
		cur = plist->next;
		while(cur->next)
		{
			cur->next = cur->next->next;	//前面的节点指向他后面第二个节点
			cur = cur->next;
		}
		cur->next = NULL;	//最后一个节点指向空
		return newlist;
	}
}

void Print(ComplexNode* plist)
{
	ComplexNode* cur = plist;
	while(cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}






测试用例:

void test()
{
	ComplexNode* node1 = BuyNode(1);
	ComplexNode* node2 = BuyNode(2);
	ComplexNode* node3 = BuyNode(3);
	ComplexNode* node4 = BuyNode(4);
	ComplexNode* node5 = BuyNode(5);
	
	node1->next = node2;
	node1->random = node3;

	node2->next = node3;
	node2->random = node1;

	node3->next = node4;
	node3->random = NULL;
	
	node4->next = node5;
	node4->random = node5;

	node5->random = node5;
	Print(node1);


	ComplexNode* newlist = CopyComplexNode(node1);
	Print(newlist);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值