复杂链表的复制(C语言)

##什么是复杂链表?

展示一下复杂链表的结构体样式。

typedef struct ComplexNode
{
	struct ComplexNode *next;
	struct ComplexNode *random; //指向一个随机值
	int data;
}ComplexNode;

复杂链表就是一个带着random指针的单链表。由于random指向的不确定性。让复杂链表的操作存在一定的困难。

假定现在有一个复杂链表的形状如下图:

在这里插入图片描述

首先我得思路是创建一个新的链表,依次复制每个节点,但是问题出现了,random指向一个随机值,这个随机值可能没有创建呢,所以依次复制会出现错误。 random的复制成了难题。

所以常规方法行不通,有时候一条路走到黑就真的黑了。

##解题思路

1.首先我们在每个链表节点的后面创建一个新的节点,将其串联起来。如下图的黄色箭头所示。
如图所示:

在这里插入图片描述

2.接下来,我们将它的新节点的random指向该指的地方,如下图的绿色箭头所示。
如图所示:
在这里插入图片描述

3.接下来我们把两个混在一起的链表拆开,拆开就可以变成两个链表。
如图所示:

在这里插入图片描述

##用C语言实现上述操作过程

ComplexNode* Copy(ComplexNode **List)
{
	//在每个链表节点后面加一个节点。
	
	ComplexNode *cur = *List;
	ComplexNode *NewNode = NULL;
	ComplexNode *Next = NULL;
	ComplexNode *NewNodeNext = NULL;
	ComplexNode *NewList = NULL;

	while (cur != NULL)  //通过循环在原始链表的基础上创建新的链表,并且挂载在后面。
	{
		NewNode = CreateNode(cur->data); //createnode函数是创建一个新的节点
		NewNode->next = cur->next;
		cur->next = NewNode;
		cur = NewNode->next;
	}
	

	//改变链表的随机指针域的结构
	
	cur = *List;

	while (cur != NULL)
	{
		if (cur->random != NULL)  //这个只要random的值不是null就需要找到 对应的newnode的random的位置。
		{
			NewNode = cur->next;
			NewNode->random = cur->random->next;
		}
		cur = cur->next->next; //依次条两个节点相当于在原链表上移动一个
	}
	
	//将新旧两个链表拆开
	
	cur = *List;
	NewList = cur->next;   
	//cur修正的是原链表,NewList修正的是新链表
	while (cur != NULL)
	{
		NewNode = cur->next;
		Next = cur->next->next;
		if (Next == NULL)  //当Next为空时,说明链表的修正快要结束了。
		{
			NewNodeNext = NULL;
		}
		else
		{

			NewNodeNext = Next->next;
		}
		cur->next = Next;
		NewNode->next = NewNodeNext;
		cur = Next;
	}
	return NewList;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的结构体是一种自定义的数据类型,可以用于存储不同类型的数据项。结构体中的数据项称为成员,可以是整型、字符型、浮点型等任意类型。我们可以通过定义结构体变量来使用结构体,并访问其成员。 指针则是存储内存地址的变量,可以指向任意类型的数据。通过指针,我们可以间接访问和修改存储在内存中的数据。结合结构体和指针的特性,可以实现对结构体的灵活操作。 结构体与指针的应用非常广泛。首先,我们可以通过指向结构体的指针来传递结构体作为函数参数,从而避免在函数调用过程中复制整个结构体的开销。这样的用法在处理大型结构体或者结构体数组时尤为重要。 其次,结构体的成员也可以是指针类型,这样可以实现动态内存分配和数据管理。例如,可以使用指向结构体的指针来创建动态大小的结构体数组,并通过指针来访问和操作数组的元素。 此外,结构体指针也常用于实现数据结构,如链表、树等。通过指针的相互连接,可以实现复杂的数据结构,并对其进行插入、删除、遍历等操作。 总结起来,结构体与指针在C语言中的应用非常灵活和广泛。通过结构体指针,我们可以实现对结构体的动态分配和管理,节省内存开销。同时,结构体指针也为实现复杂的数据结构和算法提供了便利。因此,学习和掌握结构体与指针的应用对于C语言的程序开发非常重要。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值