单链表的建立(头插法、尾插法)(数据结构与算法)

news2024/10/7 20:33:54

在这里插入图片描述

如果要把很多个数据元素存到一个单链表中,如何操作?
1.初始化一个单链表
2. 每次取一个数据元素,插入到表尾/表头

1. 尾插法建立单链表

尾插法建立的单链表元素顺序与输入数据集合的顺序相同,即按照输入数据的顺序排列。

使用尾插法建立单链表的一个常见应用是在计算机科学中进行数据输入。通过将用户输入的数据逐个添加到链表的尾部,可以方便地保存输入的数据,并在后续处理中使用。

  1. 初始化单链表
  2. 设置变量length纪录链表长度
  3. while循环{
  4. 每取一个元素e;
  5. ListInsert(L, length+1, e) 插入到尾部;
  6. length++;}
    在这里插入图片描述

尾插法(尾部插入法)是一种建立单链表的常用方法,与头插法相反,它会将新节点插入到链表的尾部位置。以下是使用尾插法建立单链表的步骤:

  1. 首先定义一个头节点,并将其初始化为空指针。
  2. 遍历需要转化为链表的数据集合。
  3. 对于数据集合中的每一个元素,创建一个新的节点,并设置其数据域为该元素的值。
  4. 若链表为空,将新节点直接设置为头节点。
  5. 若链表非空,则遍历到链表的最后一个节点,并将其指针域指向新节点。
  6. 更新链表的最后一个节点为新节点。
typedef struct LNode      //定义单链表结点类型
{
	ElemType data;		  //每个结点存放一个数据元素
	struct LNode *next;   //指针指向下一个节点
}
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)  
{
	L = (LNode *)  malloc(sizeof(LNode)); //分配一个头结点
	if (L == NULL) 		 //内存不足, 分配失败
		return false;
	L->next = NULL; 		//头结点之后暂时还没有节点
	return true;	
}
void test()
{
	LinkList L;   //声明一个指向单链表的指针
	//初始化一个空表
	InitList(L);
	//......后续代码......
}

//在第i个位置处插入元素e(带头结点)
bool ListInsert(LinkList &L, int i, ElemType e)
{
	if(i<1)
		return false;
	LNode *p;		//指针p指向当前扫描到的节点
	int j = 0; 		//指针p指向的是第几个结点
	p = L;		//L指向头结点 头结点是第0个结点,不存数据
	while( p != NULL && j < i-1) //循环找到第i-1个结点
	{
		p = p->next;
		j++;
	}
	if( p==NULL)	//i值不合法
		return false;
	LNode *s = (LNode *) malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;		//将结点s连到p之后
	return true;		//插入成功
}

当插入1个元素时,while需要循环一次,插入2个元素,while循环1此…插入n个元素,while循环n-1次。 每次都从开头开始之后遍历,循环次数为1+2+3+…+(n-1)。时间复杂度为0(n^2)

这种操作,时间复杂度太大,并不是最佳方案。

其实根本没必要每次都从头开始往后寻找, 我们可以设置一个指针r,指向表尾,当要在尾部插入一个新的数据元素时,就只需要对r结点做一个后插操作就行了。

//后插操作: 在p结点之后插入元素e
bool InsertNode(LNode *p, ElemType e)
{
	if(p == NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s==NULL)		//内存分配失败
		return false;
	s->data = e;		//用结点s保存数据元素
	s->next = p->next;   
	p->next = s; 		//将结点s连到p之后    后插操作
	return true;				
}

在这里插入图片描述

插入数据元素40

在这里插入图片描述

尾部插入一个元素,表尾指针后移一位,仍然指向最后一个元素,方便下一次插入

在这里插入图片描述

示例:尾插法建立单链表

设此次输入的整数是10,while循环检测,循环中前两句,会申请一个新的结点,然后让s这个指针指向新结点,并且把输入的x = 10放入新结点中,接下来把 r结点的next指针指向s结点。最后,再让r指针指向s结点,接下来就可以输入下一个元素x,继续插入。

时间复杂度:O(n)

LinkList List_TailInsert(LinkList &L)
{
	int x;		//设ElemType为整型
	L = (LinkList)malloc(sizeof(LNode));	//建立头结点
	LNode *s, *r = L;	//r为表尾指针
	scanf("%d", &x);	//输入结点的值
	while(x != 9999)    //该数是随便取的 ,输入9999表示结束
	{
		s = (LNode *) malloc(sizeof(LNode));  //简历一个结点s
		s->data = x; 	//将x存放到s数据域中
		r->next = s; //将表尾指针指向s结点
		r = s;	//r指向新的表尾结点
		scanf("%d",&x);
	}
	r->next = NULL; 	//尾结点指针置空
	return L;
}

LNode *s, *r = L; //r为表尾指针

在这里插入图片描述

申请一个新的结点,然后让s这个指针指向新结点,并且把输入的x = 10放入新结点中

在这里插入图片描述

接下来把 r 结点的next指针指向s结点

在这里插入图片描述

最后,再让r指针指向s结点, 接下来就可以输入下一个元素x,继续插入

在这里插入图片描述

假设继续输入 x = 16。那么会再申请一个新的结点s,让s指针指向新节点, 并把16放入新结点, 接下来把r结点的指针指向s结点, 最后…

在这里插入图片描述

将 r 指针指向s结点,再输入下一个元素27 。 以此类推完成插入操作。

在这里插入图片描述

如果x输入的是9999, 那么就可以跳过while循环,执行r->next = NULL; 让r结点的next指向NULL。
在这里插入图片描述

2. 头插法建立单链表

头插法建立单链表的特点是:新节点插入到链表的头部位置,因此建立完成的链表元素顺序是和输入数据集合的顺序相反的,即倒序排列。

对头结点的后插操作,如下图所示:

  1. 首先定义一个头节点,并将其初始化为空指针。
  2. 遍历需要转化为链表的数据集合。
  3. 对于数据集合中的每一个元素,创建一个新的节点,并设置其数据域为该元素的值。
  4. 将新节点的指针域指向当前头节点,即将新节点插入到链表的头部。
  5. 更新头节点为新节点。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p, ElemType e)
{
	if(p == NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s == NULL)	//内存分配失败
		return false;	
	s->data = e;		//用结点s保存数据元素e
	s->next = p->next;
	p->next = s;		//将结点s连接到p之后
	return true;
}

在这里插入图片描述

  • 如上图所示,此处,尾插法中是没有 L->next = NULL 这一句的,但在头插法中,这句非常必要。由于是动态分配,如果头结点指向没有被初始化为NULL,那头结点L->next 很有可能指向了内存中某一神秘区域,从而形成脏数据,影响后面的插入操作。

养成好习惯,只要是初始化单链表,都先把头指针指向NULL

  • 按照头插法形成的规则,最终形成的单链表刚好是输入元素的逆序,这种性质非常重要!!!
    很多题目中都用得到单链表的逆置。
    在这里插入图片描述

3. 知识点回顾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题09】C++输出回文数 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++输出回文数 一、题目要求 1、编程实现 2、输入输出 二、算法分析

MySQL中表的增删改查

目录 一、CRUD 二、新增&#xff08;Create&#xff09; &#xff08;1&#xff09;语法 &#xff08;2&#xff09;单行数据全列插入 &#xff08;3&#xff09;多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09; &#xff08;1&#xff09;语法 …

vue3 + vite 安装配置及项目创建

node 和 npm 安装就不讲了&#xff0c;需要注意的是 node 需要版本是 16 以上。 VUE官网&#xff1a; https://cn.vuejs.org/ 一. 安装vue vite 1. 安装vue 方法一&#xff1a;<script> 标签 CDN 引入方式 <script src"https://unpkg.com/vue3/dist/vue.glo…

小米11 安装面具magisk 实现root

为了在安卓上抓包chatgpt 只能root小米11 来安装抓包工具小黄鸟 才能安装根证书来解析https。 1.官方解锁 2.下载小米11 安卓12 的开发版本 venus_images_V13.0.6.1.15.DEV_20220308.0000.00_12.0_cn_cb6b0c891f.tgz 进入刷机fastboot 3.进系统开启usb调试模式&#xff0c;…

GraphPad Prism v10.0.0.3(医学统计分析绘图软件)

GraphPad Prism 是一款医学统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。以下是 GraphPad Prism 的主要功能和特点&#xff1a; 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据…

PY32F071单片机,主频最高72 M,带一路DAC,USB

PY32F071 系列微控制器采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入高达128 Kbytes flash 和 16 Kbytes SRAM 存储器&#xff0c;最高工作频率 72 MHz。包含多种不同封装类型多款产品。芯片集成多路 I2C、SPI、USART 等通讯外设&#xff0c;1 …

linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点

linux中各种最新网卡2.5G网卡驱动&#xff0c;不同型号的网卡需要不同的驱动&#xff0c;整合各种网卡驱动&#xff0c;包括有线网卡、无线网卡、自动安装Wi-Fi热点。 最近在做路由器二次开发&#xff0c;现在市面上卖的新设备&#xff0c;大多数都采用了2.5G网卡&#xff0c;…

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源&#xff0c;需要配置pubspec.yaml&#xff0c;将本地的静态资源添加到assets下面&#xff1a; 然后在flutter引入这些静态资源&#xff1a; Image.asset("images/squick.png") 就可以在app中看到这个图片了&#xff1a; 也可以使用网…

vue使用Web Speech API实现语音播报

SpeechSynthesisUtterance对象用于表示要播放的语音内容&#xff0c;SpeechSynthesis对象则用于控制语音的播放、暂停、停止等操作。 const synth window.speechSynthesis const msg new SpeechSynthesisUtterance() // 语音播放 const playVoice (text) > {synth.canc…

双热点机制结合。5+铜死亡+铁死亡相关基因生信思路

今天给同学们分享一篇结合铜死亡和铁死亡相关基因预测肿瘤预后、免疫和药敏的生信文章“A novel signature of combing cuproptosis- with ferroptosis-related genes for prediction of prognosis, immunologic therapy responses and drug sensitivity in hepatocellular car…

如何翻译SCI论文, 中译英哪里比较专业?

众所周知&#xff0c;SCI论文是被科学引文索引(SCI)收录的期刊上发表的论文。SCI论文是学术界内具有较高影响力和引用率的文章&#xff0c;通常被高度认可和重视。因此&#xff0c;SCI论文翻译对译员的要求很高。那么&#xff0c;如何翻译SCI论文&#xff0c; 中译英哪里比较专…

Oracle-执行计划

执行计划生成的几种方式 1. EXPLAIN FOR 语法&#xff1a; EXPLAIN PLAN FOR SQL语句SELECT * FROM TABLE(dbms_xplan.display());优点&#xff1a; 无需真正执行SQL 缺点&#xff1a; 没有输出相关的统计信息&#xff0c;例如产生了多少逻辑读、物理读、递归调用等情况无法判…

【考研数据结构代码题2】删除单链表倒数第n个结点

题目&#xff1a;删除单链表倒数第n个结点 难度&#xff1a;★ 算法思路&#xff1a; 首先题目没有指明链表的长度&#xff0c;多以首先需要编写一个函数getLength()来求表长&#xff0c;其次删除倒数第n个结点&#xff0c;即删除正数第length-n1个结点&#xff0c;这是二者之间…

章鱼网络进展月报 | 2023.10.1-10.31

章鱼网络大事摘要 1、Louis 成功竞选 NDC 的 HoM 议席&#xff0c;将会尽最大努力推动 NEAR 变革。2、章鱼网络受邀参加在土耳其主办的 Cosmoverse2023&#xff0c;分享 Adaptive IBC 的技术架构。3、2023年10月8日章鱼日&#xff0c;是章鱼网络主网上线2周年的纪念日。 …

WebDAV之π-Disk派盘 + Smart File Manager

推荐一款超级文件管理器手机版。不仅可以自建热点分享,还可以用电脑查看和下载手机上的文件,支持连接云盘服务。 Smart File Manager是一款简洁、强大、小巧完美的文件管理应用程序,它能自动识别用户内部存储器中所有的文件信息,包括音乐、视频、图片、APK、下载、文件、压…

【计算机网络】数据链路层——以太网协议

目录 1.完整的数据传输流程2.以太网以太网通信原理以太网帧格式MAC地址对比MAC地址和IP地址MTU 3.ARP协议ARP协议的作用ARP协议的格式ARP协议的原理 1.完整的数据传输流程 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送…

欧洲爆火的Vinted是什么平台?值得入驻吗?如何入驻?

近年来&#xff0c;Vinted已经成为欧洲最受欢迎的在线二手服装买卖市场之一。该平台因其用户友好的界面、丰富的商品选择以及在用户之间创建的社区感而备受关注。在本文中&#xff0c;我们将更详细地了解Vinted的运作方式以及您开始出售商品需要知道的内容。 一、什么是Vinted&…

[动态规划] (四) LeetCode 91.解码方法

[动态规划] (四) LeetCode 91.解码方法 91. 解码方法 题目解析 (1) 对字母A - Z进行编码1-26 (2)11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 (3) 0n不能解码 (4) 字符串非空&#xff0c;返回解码方法的总数 解题思路 状态表示 dp[i]&#xff1a;以i为结…

接口自动化测试难点:数据库验证解决方案 百分之90人不知道

接口自动化中的数据库验证&#xff1a;确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环&#xff0c;而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码&#xff0c;帮…

蓝桥杯:买不到的数目

对于两个互质的正整数 n , m n,m n,m,请找出来不能被 n n n和 m m m组成的最大数 X X X 例如:对于4,7那么 X X X17&#xff0c;因为对于大于17的任一数都可由4和7组成。 重新翻译题目&#xff1a; 对于任一大于 X X X的正整数 Y Y Y满足 Y a n b m Y a \times nb \times m …