当前位置: 首页 > news >正文

【数据结构】单链表的基本操作(节点建立、插入删除)

  • 1. 单链表的基本操作
    • 1.1. 链表的定义
    • 1.2. 链表的创建(初始化)
      • 1.2.1. 不带头结点的链表
      • 1.2.2. 带头结点的链表
    • 1.3. 链表的插入和删除
      • 1.3.1. 按位序插入
        • 1.3.1.1. 带头结点
        • 1.3.1.2. 不带头结点
      • 1.3.2. 指定节点的后插操作
      • 1.3.3. 指定元素的前插操作
      • 1.3.4. 按位序删除
        • 1.3.4.1. 带头结点
        • 1.3.4.2. 不带头结点
      • 1.3.5. 指定元素的删除操作

1. 单链表的基本操作

链表是一种基本的数据结构,在很多数据结构中都会使用链表的方式进行建立,所以将链表学会学通透很有必要。

1.1. 链表的定义

链表的定义是基于结构体之上的,一个链表一般需要定义两方面的东西,一个是链表的节点,一个是链表的指针。一个链表的定义示例如下:

typedef struct ListNode {int data;struct ListNode *next;
}LNode,*List;

上述代码中的val是数据域,用来存放数据,next是指针域,用来存放下一个节点的地址。
并且该代码采用了typedef定义了一个别名LNode,用来指代链表的节点,List是链表的指针,用来指向链表的第一个节点。

1.2. 链表的创建(初始化)

链表的创建有两种方式,一种是带头结点的,另一种是不带头节点的。

1.2.1. 不带头结点的链表

不带头结点的链表的创建方式如下:

void InitList(List *L)
{L=NULL;
}

即使得链表的下一个节点为空。

1.2.2. 带头结点的链表

带头结点的链表的创建方式如下:

void InitList(List *L)
{L=(List)malloc(sizeof(LNode));if(L==NULL){return ;//此时表示创建头结点失败}L->next=NULL;//头结点指向的下一个节点为空
}

头结点的好处就在于,当我们需要对链表进行一个操作的时候,不需要专门对链表的第一个节点进行特殊操作,我们只需要对所有的代码编写一个固定的函数,通过传递不同的值就可以实现特定高度功能。

1.3. 链表的插入和删除

1.3.1. 按位序插入

1.3.1.1. 带头结点

链表的插入,需要先找到要插入位置的前后节点,然后创建一个指针,使得前一个节点指向这个指针,这个指针再指向下一个节点。

在按位序插入的过程中,我们需要输入链表的头结点(供遍历寻找目标位置),要插入的位置和元素。
示例代码如下:

bool ListInsert(List *L,int i,int e)
{if(i<1){return false;}LNode *p; //p表示当前指向的是哪个节点int j=0; //j表示的是当前指向节点的位置p=L; //目前先让p指向头节点while(p!=NULL&&j<i-1) //循环找到要插入节点的前一个节点{p=p->next;j++;}LNode *s=(LNode *)malloc(sizeof(LNode));s.data=e;s->next=p->next;p->next=s;return true;
}
1.3.1.2. 不带头结点

不带头结点的插入与带头结点的插入类似,但是相对带头节点来说更加繁琐。

bool ListInsert(List *L,int i,int e)
{if(i<1){return false;}if(i==1){LNode *q=(LNode *)malloc(sizeof(LNode));q->data=e;q->next=L;L=q;}LNode *p; //p表示当前指向的是哪个节点int j=0; //j表示的是当前指向节点的位置p=L; //目前先让p指向头节点while(p!=NULL&&j<i-1) //循环找到要插入节点的前一个节点{p=p->next;j++;}LNode *s=(LNode *)malloc(sizeof(LNode));s.data=e;s->next=p->next;p->next=s;return true;
}

同样传入的是第一个节点的地址,要加入节点的位置和要加入的元素,区别就在于加入要在第一个位置插入元素,就需要特别处理一下。

1.3.2. 指定节点的后插操作

在给定节点后插入节点的操作相对简单,示例代码如下:

bool InsertNextNode(LNode *p,int x)
{if(p==NULL){return false;}LNode *s=(LNode *)malloc(sizeof(LNode));s->next=p->next;p->next=s;s=>data=x;return true;
}

1.3.3. 指定元素的前插操作

在指定元素之前要插入一个元素,最容易想到的办法是将整个链表遍历一遍,之后找到这个元素的前驱节点,转换成后插操作。但是这种办法实现起来较为复杂,所以我们转换一种思维方式,采取新的方法。

我们尝试在指定节点之后先插入一个节点,然后把指定节点的值赋给新节点,之后再把要插入的值赋给旧节点。总而言之就是现在之后插入节点,然后把两个节点的值互换,就相当于将前后节点互换了。示例代码如下:

bool InsertPriorNode(LNode *p,int x)
{if(p==NULL){return false;}LNode *s=(LNode *)malloc(sizeof(LNode));s->next=p->next;p->next=s;s->data=p->data;p->data=x;return true;
}

1.3.4. 按位序删除

1.3.4.1. 带头结点

在带头结点的删除节点操作中,我们需要给函数传递链表的第一个节点的位置,要删除的位置和一个变量用来存储删除节点的元素值。

删除的主要操作是创建一个指针(不分配内存空间)指向要删除的节点,然后让要删除指针前一个节点指向要删除指针的后一个节点,然后将要删除的指针释放内存,从而达到目的。

示例代码如下:

bool ListDelete(List L,int i,int x)
{if(i<1){return false;}LNode *p;int j=0;p=L;while(p!=NULL;j<i-1){p=p->next;j++;}if(p==NULL){return false;}if(p->next==NULL){return false;}LNode *q=p->next;x=q->data;p->next=q->next;free(q);
}
1.3.4.2. 不带头结点

与不带头结点的插入类似,这里不再赘述。

1.3.5. 指定元素的删除操作

删除操作和带头结点的的相似,指定元素和指定元素的插入相似,这里不再赘述!

相关文章:

【数据结构】单链表的基本操作(节点建立、插入删除)

1. 单链表的基本操作 1.1. 链表的定义1.2. 链表的创建&#xff08;初始化&#xff09; 1.2.1. 不带头结点的链表1.2.2. 带头结点的链表 1.3. 链表的插入和删除 1.3.1. 按位序插入 1.3.1.1. 带头结点1.3.1.2. 不带头结点 1.3.2. 指定节点的后插操作1.3.3. 指定元素的前插操作1.3…...

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。

DEM格式转换&#xff1a;转换NSDTF-DEM国标数据格式为通用格式&#xff0c;使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式&#xff0c;其有两种文件组织方式&#xff0c;即NSDTF-DEM和USGS-DEM。 &#xff08;1&#xff09;NSDT…...

施耐德电气:勾勒未来工业愿景,赋能中国市场

9月19日&#xff0c;第23届中国国际工业博览会&#xff08;简称“工博会”&#xff09;在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家&#xff0c;施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解&#xff0c;不仅展示了其贯通企业设计…...

安防监控产品经营商城小程序的作用是什么

安防监控产品覆盖面较大&#xff0c;监控器、门禁、对讲机、烟感等都有很高用途&#xff0c;家庭、办公单位各场景往往用量不少&#xff0c;对商家来说&#xff0c;市场高需求背景下也带来了众多生意&#xff0c;但线下门店的局限性&#xff0c;导致商家想要进一步增长不容易。…...

php中判断指定字符串是否包含指定字符的封装函数

在 PHP 中&#xff0c;你可以使用内置的字符串函数 strpos() 来判断一个字符串是否包含指定的字符或子字符串。以下是一个简单的封装函数&#xff0c;它使用 strpos() 来判断指定字符串是否包含指定字符&#xff0c;并返回一个布尔值。 function stringContains($string, $cha…...

GICI-LIB源码阅读(三)因子图优化模型

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 三、因子图优化&#xff08;FGO&#xff09;1、因子图模型2、因子图优化状态估计模型3、因子图优化求解4、Ceres 非线性最小二乘库5、GICI-LIB 中…...

5、Docker安装mysql主从复制与redis集群

安装mysql主从复制 主从搭建步骤 1.1 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master #3307映射到3306&#xff0c;容器名为mysql-master -v /app/mysql/mydata/mysql-master/log:/var/log/mysql #容器数据卷 -v /app/mysql/mydata/mysql-master/dat…...

【AI视野·今日NLP 自然语言处理论文速览 第四十三期】Thu, 28 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 28 Sep 2023 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Cross-Modal Multi-Tasking for Speech-to-Text Translation via Hard Parameter Sharing Authors Brian Yan,…...

Unity 制作登录功能01-创建登录的UI并获取输入内容

1.创建UI面板 导入插件TextMesh Pro 2.编写脚本获取用户输入 这里用的是输入框侦听函数&#xff0c;所有UI都可以使用侦听函数 &#xff0c;需要注意TMP_InputField 这个类是UI中导入的一个插件TextMesh Pro&#xff01;在代码中需要引用using TMPro; 命名空间&#xff01; …...

什么是用户画像?

(1&#xff09;首先用户画像是个动词逻辑&#xff0c;不是名词&#xff0c;就是给用户绘制肖像。 (2&#xff09;在互联网这个平台上&#xff0c;绘制肖像就相当千给用户打标签 (3&#xff09;标签通常是人为规定的高度精炼的特征标识&#xff0c;如年龄、性别、地域、兴趣等…...

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等&#xff0c;本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等&#xff0c;欢迎持续关注我们哦~ Dev…...

基于AIOps实现智慧园区极简IT运维

随着物联网、云平台、大数据、人工智能等技术的发展&#xff0c;并逐步投入到智慧园区的建设&#xff0c;传统园区数字化转型加快。园区的形式包括产业园区、教育园区、制造业园区、科研园区、社区等等&#xff0c;园区形态不断演进和发展&#xff0c;园区网承载的对象和业务也…...

chatgpt 只会死记硬背吗

本周写两篇关于 chatgpt 的随感&#xff0c;我不善于写文档&#xff0c;所以我的文字多是输出直感和观点&#xff0c;而不是知识&#xff0c;没有关于 chatgpt 的原理和应用&#xff0c;甚至术语也不匹配&#xff0c;反正就是想到哪算哪吧。 都说 chatgpt 没有内在逻辑&#xf…...

03-Zookeeper客户端使用

上一篇&#xff1a;02-Zookeeper实战 1. 项目构建 zookeeper 官方的客户端没有和服务端代码分离&#xff0c;他们为同一个jar 文件&#xff0c;所以我们直接引入zookeeper的maven即可&#xff0c; 这里版本请保持与服务端版本一致&#xff0c;不然会有很多兼容性的问题 <…...

自然语言处理(NLP)学习之与HanLP的初相识

目录 前言 一、自然语言处理基本知识 1、NLP类别 2、核心任务 二、Hanlp简要介绍 三、Hanlp云服务能力 1、全新云原生2.x 2、Python api调用 3、Go api调用 4、Java api调用 四、Hanlp native服务 1、本地开发 总结 前言 在ChatGPT的滚滚浪潮下&#xff0c;也伴随着人工智…...

JDBC【DBUtils】

一、 DBUtils工具类&#x1f353; (一)、DBUtils简介&#x1f95d; 使用JDBC我们发现冗余的代码太多了,为了简化开发 我们选择使用 DbUtils Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库&#xff0c;使用它能够简化JDBC应用程序的开发&#xff0c…...

大数据Doris(一):Doris概述篇

文章目录 Doris概述篇 一、前言 二、Doris简介...

vue 基于vue-seamless-scroll无缝滚动的用法和遇到的问题解决

vue 基于vue-seamless-scroll无缝滚动的用法和遇到的问题解决 背景 最近再做一个大屏项目,需要用到表格滚动效果,之前自己写过js实现,最近发现一个组件vue-seamless-scroll可以实现滚动,感觉挺方便的,准备用一下,但是用完之后才发现这个组件有很多坑需要解决.我把用法和一些问…...

SmartX 边缘计算解决方案:简单稳定,支持各类应用负载

在《一文了解近端边缘 IT 基础架构技术需求》文章中&#xff0c;我们为大家分析了边缘应用对 IT 基础架构的技术要求&#xff0c;以及为什么超融合架构是支持边缘场景的最佳选择。值得一提的是&#xff0c;IDC 近日发布的《中国软件定义存储&#xff08;SDS&#xff09;及超融合…...

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...