数据结构历年考研真题对应知识点(单链表、双链表、循环链表)

目录

2.3线性表的链式表示

2.3.1单链表的定义

【单链表的应用(2009、2012、2013、2015、2016、2019)】

2.3.2单链表上基本操作的实现

【单链表插入操作后地址或指针的变化(2016)】

2.3.3双链表

【双链表中插入操作的实现(2023)】

【循环双链表中删除操作的实现(2016)】

2.3.4循环链表

【循环单链表中删除首元素的操作(2021)】


2.3线性表的链式表示

2.3.1单链表的定义

单链表的应用(2009、2012、2013、2015、2016、2019)】

线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。

为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息之外,还需要存放一个指向其后继的指针。

单链表中结点类型的描述如下:

typedef struct INode{   //定义单链表结点类型ElemType data;          //数据域struct LNode *next;  //指针域
}LNode, *LinkList;

利用单链表可以解决顺序表需要大量连续存储单元的缺点,但附加的指针域,也存在浪费存储空间的缺点。

由于单链表的元素离散地分布在存储空间中,因此是非随机存取的存储结构,即不能直接找到表中某个特定结点。查找特定结点时,需要从表头开始遍历,依次查找。

2.3.2单链表上基本操作的实现

单链表插入操作后地址或指针的变化(2016)】

插入结点操作将值为x的新结点插入到单链表的第i个位置。

先检查插入位置的合法性,然后找到待插入位置的前驱,即第i-1个结点,再在其后插入。其操作过程如图 2.5 所示。

首先査找第 i-1 个结点,假设第 i-1 个结点为*p,然后令新结点*s的指针域指向*p的后继,再令结点*p的指针域指向新插入的结点*s。

bool ListInsert(linklist &L,int i,ElemType e)LNode *p=L;              //指针p指向当前扫描到的结点int j=0;                 //记录当前结点的位序,头结点是第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;                //②return true;
}

插入时,①和②的顺序不能颠倒,否则,先执行p->next=s 后,指向其原后继的指针就不存在了,再执行 s->next=p->next 时,相当于执行了 s->next=s,显然有误。

本算法主要的时间开销在于查找第 i-1 个元素,时间复杂度为 O(n)。

若在指定结点后插入新结点,则时间复杂度仅为 O(1)。

需注意的是,当链表不带头结点时,需要判断插入位置i是否为1,若是,则要做特殊处理,将头指针工指向新的首结点。

当链表带头结点时,插入位置i为1时不用做特殊处理。

扩展:对某一结点进行前插操作。

前插操作是指在某结点的前面插入一个新结点,后插操作的定义刚好与之相反。

在单链表插入算法中,通常都采用后插操作。以上面的算法为例,先找到第 i-1 个结点,即插入结点的前驱,再对其执行后插操作。由此可知,对结点的前插操作均可转化为后插操作,前提是从单链表的头结点开始顺序查找到其前驱结点,时间复杂度为O(n)。

此外,可采用另一种方式将其转化为后插操作来实现,设待插入结点为*s,将*s插入到*p的前面。我们仍然将*s插入到*p的后面,然后将p->data与 s->data 交换,这样做既满足逻辑关系,又能使得时间复杂度为O(1)。该方法的主要代码片段如下:

s->next=p->next; //修改指针域,不能颠倒
p->next=s;
temp=p->data;    //交换数据域部分
p->data=s->data;
s->data=temp;

2.3.3双链表

双链表中插入操作的实现(2023)】

在双链表中p所指的结点之后插入结点*s,其指针的变化过程如图 2.10 所示。

插入操作的代码片段如下:

s->next=p->next;     //将结点*s插入到结点*p之后
p->next->prior=s;
s->prior=p;
p->next=s;

上述代码的语句顺序不是唯一的,但也不是任意的,①步必须在④步之前,否则*p的后继结点的指针就会丢掉,导致插入失败。

循环双链表中删除操作的实现(2016)】

删除双链表中结点*p的后继结点*q,其指针的变化过程如图 2.11所示。

删除操作的代码片段如下:

删除双链表中结点*p的后继结点*q;

删除操作的代码片段如下:

p->next=q->next;
q->next->prior=p;
free(q);            //释放结点空间

在建立双链表的操作中,也可采用如同单链表的头插法和尾插法,但在操作上需要注意指针的变化和单链表有所不同。

2.3.4循环链表

循环单链表中删除首元素的操作(2021)】

循环单链表的插入、删除算法与单链表的几乎一样,所不同的是若操作是在表尾进行,则执行的操作不同,以让单链表继续保持循环的性质。当然,正是因为循环单链表是一个“环”,所以在任何位置上的插入和删除操作都是等价的,而无须判断是否是表尾。

在单链表中只能从表头结点开始往后顺序遍历整个链表,而循环单链表可以从表中的任意一个结点开始遍历整个链表。有时对循环单链表不设头指针而仅设尾指针,以使得操作效率更高其原因是,若设的是头指针,对在表尾插入元素需要O(n)的时间复杂度,而若设的是尾指针r,r->next即为头指针,对在表头或表尾插入元素都只需要 O(1)的时间复杂度。

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

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

相关文章

地图上绘制地铁线路

需求背景 不管是之前的pms 地铁还是location都会有需求涉及到地图上绘制地铁线路&#xff0c;来查看当前位置是否靠近地铁口&#xff0c;常规的交互可以看下高德地图&#xff0c;如图所示&#xff1a; 需求分析 不管是高德地图还是百度地图都提供了简易版的地铁线路图&#x…

Excel如何设置自动更新的固定选项

日常工作中你是否想要某数据列设置固定选项&#xff0c;如人力组、财务组、综合组、业务组等&#xff0c;可用“数据验证”实现&#xff0c;如后期新增选项“党建组”&#xff0c;该如何快速处理&#xff1f; 今天刘小生分享“超级表数据验证”方式&#xff0c;只实现固定选项…

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局、工具栏带中文提示 1.在vue.config.js 文件中添加 一下内容2.下载安装插件3.在Editor组件中引入插件4.使用Editor组件&#xff08;特别注意要的加 v-if &#xff09;5.bug 之 imageResize的 img的style丢失1.先创建一…

不是所有洗碗机都能空气除菌 友嘉灵晶空气除菌洗碗机评测

精致的三餐让你以为生活是“享受”&#xff0c;可饭后那些油腻的锅碗瓢盆却成了你我美好生活的最大障碍。想要只吃美食不洗碗&#xff0c;那一台优秀的洗碗机就必不可少了&#xff01;今天&#xff0c;ZOL中关村在线要评测的就是这样一台不光洗得干净更能有效除菌抑菌的洗碗机—…

SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果

访问地址&#xff1a; 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/site 后端文档&#xff1a; SpringBoovue3整合讯飞星火3.5通过webscoket实现聊天功能&#xff08;全网首发&#xff09;附带展示效果_springboot websocket vue3-CSDN博客https://blog.csdn.net/qq_53722…

SAP MIGO 050 BADI:字段 GOITEM-XXXXX 未准备好输出

背景&#xff1a; MIGO过账时候需要根据某些条件更改某些字段的值&#xff0c;当要改的字段在前台不显示时&#xff0c;通过MB_MIGO_BADI~LINE_MODIFY去更改时&#xff0c;则会出现以下报错&#xff1a;MIGO050 解决方案1&#xff1a; 通过配置将该字段配置显示出来即可&…

电影美学复古胶片特效视频转场模板 | Premiere Pro 项目工程文件

这个Premiere Pro项目工程文件是一个电影美学胶片特效视频转场模板&#xff0c;每个过渡效果都散发出一种有机的怀旧魅力&#xff0c;让人回忆起经典电影卷轴和模拟摄影的独特美感。 项目特点&#xff1a; 胶片烧伤过渡效果&#xff1a;包括从微妙的闪烁到大胆的爆发&#xff…

学习总结报告模板

学习总结报告模板1 --年10月15日进入--公司至今已近两周时间&#xff0c;通过这段时间的工作和学习&#xff0c;已经适应了新的工作环境&#xff0c;了解了公司的发展历史及企业文化、认清了公司的组织结构及配置&#xff0c;熟识了大部分的同事&#xff0c;掌握了公司的大部分…

南充文化旅游职业学院领导一行莅临泰迪智能科技参观交流

6月18日&#xff0c;南充文化旅游职业学院旅游系副书记刘周、教务处教学运行与质量保障科科长及智慧旅游技术应用专业教研室主任李月娴、大数据技术专业负责人 龙群才、大数据技术专业专任教师 李昱洁莅临泰迪智能科技产教融合实训中心参观交流。泰迪智能科技董事长张良均、副总…

两种单例模式(保证线程安全)

开始前&#xff0c;球球各位读者给个三连吧&#xff0c;有错误感谢指出&#xff0c;谢谢 单例模式也叫单个实例&#xff0c;也就是这个类只有且只能有一个实例对象&#xff0c;这样一个类就叫做“单例”&#xff1b;单例模式有很多种&#xff0c;这里只介绍“饿汉模式”和“懒…

【Java】已解决Java中的java.util.NoSuchElementException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java中的java.util.NoSuchElementException异常 一、分析问题背景 java.util.NoSuchElementException是Java中常见的运行时异常&#xff0c;它通常发生在使用迭代器&#xf…

swagger下载文件名中文乱码、swagger导出文件名乱码、swagger文件导出名称乱码、解决swagger中文下载乱码bug

文章目录 一、场景描述&#xff1a;swagger导出文件名称乱码二、乱码原因三、解决方法3.1、方法一、在浏览器中输入地址下载3.2、方法二、swagger升级为2.10.0及以上 四、可能遇到的问题4.1、DocumentationPluginsManager.java:152 一、场景描述&#xff1a;swagger导出文件名称…

springboot与flowable(7):流程变量

一、启动时添加流程变量 拿第一个流程图举例&#xff0c;创建一个新的流程定义。 Testvoid contextLoads() {DeploymentBuilder deployment repositoryService.createDeployment();deployment.addClasspathResource("process01/FirstFlow.bpmn20.xml");deployment.…

android | MemoryLeakMonitor.jar is not exist! 目前还是存在这个问题,好像解决不到

2024了&#xff0c;用的华为的老机子 navo3 真机测试&#xff0c;目前还是这个渲染问题&#xff1a;滑动验证页面 MemoryLeakMonitor.jar is not exist! Software rendering doesnt support hardware bitmaps gpu的渲染问题&#xff1a; 这条信息“Software rendering doesnt…

动态规划-简单多状态dp问题 -- 删除并获得点数

动态规划-简单多状态dp问题 – 删除并获得点数 文章目录 动态规划-简单多状态dp问题 -- 删除并获得点数题目重现读懂题目算法流程示例代码 题目重现 题目链接&#xff1a;删除并获得点数 - 力扣 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#…

用画图,将2张图片,合并成 一张图片 + 压缩体积

合并 第一步&#xff1a;选中要做比较的两张图片其中一张&#xff0c;单击鼠标右键&#xff0c;选择“打开方式--画图”。 第二步&#xff1a;如果图片过大&#xff0c;占据了整个屏幕不好观察&#xff0c;用右下角的标尺&#xff0c;缩小视图 第三步&#xff1a;鼠标左键按住…

HTTP学习记录(基于菜鸟教程)

文章目录 1.简介1.1常用的HTTP方法1.2Http版本1.3注意事项 2.Https3.Http消息结构3.1客户端请求消息3.2响应消息 4.常见的响应头5.HTTP状态码6.Http content-type在这里插入图片描述 7.MIME类型8.HTTP2 1.简介 Http&#xff0c;被称为超文本传输协议&#xff0c;HyperText Tran…

训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: "sea", "eat"输出: …

使用fetch加载阿里云的在线json 出现403错误

在做地图项目的时候&#xff0c;引用了阿里云的在线JSON地图数据。 问题描述&#xff1a; 但是本地开发使用fetch请求json地址的时候接口却出现了403错误&#xff0c;把地址直接复制到浏览器上却能正常打开。 https://geo.datav.aliyun.com/areas_v3/bound/330000_full.json …

06-操作元素

在前面的文章中重点介绍了一些元素的定位方法&#xff0c;定位到元素后&#xff0c;就需要操作元素了。本篇通过简单案例来介绍app应用中的一些常用操作。 一、案例介绍 下面列表中有四个字典&#xff0c;每个字典中的num1代表第一个操作数&#xff0c;num2代表第二个操作数&a…