03链表+栈+队列(D1_链表(D1_基础学习))

目录

一、什么是链表

二、基本操作

三、为什么要使用链表

四、为什么能够在常数时间访问数组元素

数组优点

数组缺点

五、动态数组诞生

链表优点

链表缺点

六、链表、数组和动态数组的对比

七、 链表种类

1. 单向链表

2. 双向链表

3. 循环链表

八、链表衍生

......


一、什么是链表

链表是一种用于存储数据集合的数据结构。

链表有以下属性:

  1. 相邻元素之间通过指针连接
  2. 最后一个元素的后继指针值为 NULL
  3. 在程序执行过程中,链表的长度可以增加或缩小
  4. 链表的空间能够按需分配(直到系统内存耗尽)
  5. 没有内存空间的浪费(但是链表中的指针需要一些额外的内存开销)

二、基本操作

增删改查、计数等操作

三、为什么要使用链表

如果使用数组,整个数组所有的元素都存储在操作系统分配的一个内存块中。

通过使用特定元素的索引作为数组下标,可以在常数时间内访问数组元素。

四、为什么能够在常数时间访问数组元素

为了访问一个数组元素,该元素的内存地址需要计算其距离数组基地址的偏移量。

需用一个乘法计算偏移量,再加上基地址,就可获得某个元素的内存地址。

数组优点

简单且易用。

访问元素快(常数时间)

数组缺点

  1. 大小固定:数组的大小是静态的(在使用前指定数组的大小)。
  2. 分配一个连续空间块:数组初始分配空间时,有时无法分配能存储整个数组的内存空间(当数组规模太大时)。
  3. 基于位置的插入或删除操作实现复杂:

比如说:

如果要在数组中的给定位置插人元素,可能需要移动存储在数组中的其他元素,

这样才能腾出指定的位置来放插入的新元素,如果在数组的开始位置插人元素,那么移动操作的开销将更大。

五、动态数组诞生

动态数组是一种可随机存取且可自动调整大小的线性数据结构,能够添加或删除元素。

也称为可增数组、可变长数组、动态表、数组列表,在Java语言,就是ArrayList。

实现动态数组的一个简单方法是,首先初始化固定大小的数组。

一旦数组存储满了,创建一个两倍于原始数组大小的新数组。

同样,若数组中存储的元素个数小于数组大小的一半,则把数组大小减少一半。

链表优点

可以在常数时间内扩展。

当创建数组时必须分配能存储一定数量元素的内存。

如果向数组中添加更多的元素,那么必须创建一个新的数组,然后把原数组中的元素复制到新数组中,这将花费

大量的时间。而我们的链表是动态分配存储空间,采取的是随机分配存储。

链表缺点

链表有许多不足,链表的主要缺点在于访问单个元素的时间开销问题。

数组是随机存取的,即存取数组中任一元素的时间开销为O(1)。而链表在最差情况下访问一个元素的开销为

O(n)。

数组在存取时间方面的另外一个优点是内存的空间局部性。

由于数组被定义为连续的内存块,所以任何数组元素与其邻居是物理相邻的。

这极大得益于现代CPU的缓存模式。

尽管链表的动态分配存储空间有很大的优势,但在存储和检索数据的开销方面却有很大的不足。

有时很难对链表操作。

如果要删除最后一项,倒数第二项必须更改后继指针值为NULL。

这需要从头遍历链表,找到倒数第二个结点的链接,并设置其后继指针为 NULL。

最后,链表中的额外指针引用需要浪费内存。

六、链表、数组和动态数组的对比

七、 链表种类

1. 单向链表

链表通常是指单向链表,它包含多个结点,每个结点有一个指向后继元素的next(下一个)指针。

表中最后一个结点的next指针值为 NULL,表示该链表的结束。

2. 双向链表

双向链表的优点是:对于链表中一个给定的结点,可以从两个方向进行操作。

在单向链表中,只有获得结点的前驱结点的指针,才能删除该结点。

然而,在双向链表中,即使没有一个结点的前驱结点的地址,也能删除该结点,

因为每个结点有都一个指向前驱结点的指针,可以直接后退到前驱结点。


双向链表缺点:

每个结点需再添加一个额外的指针,因此需要更多的空间开销。

结点的插人或删除更加费时,因为它需要更多的指针操作。

3. 循环链表

在单向链表和双向链表中,都采用 NULI 值表示链表的结束,然而,循环链表没有结束标志。

当遍历循环链表时需要特别小心,否则将会无限地遍历链表,因为在循环链表中每个结点都有一个后继结点。

与单向链表不同,循环链表中没有next 指针为 NULI 的结点。

循环链表在某些情况下是非常有用的。

例如,当多个进程需要在相同的时间内使用同一个计算机资源(CPU)时,

必须确保在所有其他进程使用这些资源完前,没有进程访问该资源(轮询算法)

在循环链表中,使用表头结点访问元素(与单向链表和双向链表中的表头结点相似)

上图,指的是单向循环链表,当然还有我们的双向循环链表,工作原理类似。

八、链表衍生

......

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业微信开发012_使用WxJava企业微信开发框架_封装第三方应用企业微信开发005_多企业授权实现---企业微信开发014

这里主要说一下如何授权的思路,如何来做,其实非常简单, 如果你有很多企业微信需要授权以后才能使用自己开发的,第三方企业微信功能,那么 首先,在企业列表中,你可以给某个企业去配置,这个企业,他对应的企业微信的,比如, 这个企业的企业id,cropID,当然还可以有,比如企业名称,用…

“AI智能分析综合管理系统:企业管理的智慧中枢

在如今这个快节奏的商业世界里,企业面临的挑战越来越多,数据像潮水一样涌来,管理工作变得愈发复杂。为了应对这些难题,AI智能分析综合管理系统闪亮登场,它就像是企业的智慧中枢,让管理变得轻松又高效。 过去…

蓝桥杯思维训练营(三)

文章目录 题目详解680.验证回文串 II30.魔塔游戏徒步旅行中的补给问题观光景点组合得分问题 题目详解 680.验证回文串 II 680.验证回文串 II 思路分析:这个题目的关键就是,按照正常来判断对应位置是否相等,如果不相等,那么就判…

[LeetCode] 二叉树 I — 深度优先遍历(前中后序遍历) | 广度优先遍历(层序遍历):递归法迭代法

二叉树 基础知识深度优先遍历递归法迭代法(栈)144# 二叉树的前序遍历94# 二叉树的中序遍历145# 二叉树的后序遍历 广度优先遍历递归法迭代法(队列)102# 二叉树的层序遍历107# 二叉树的层序遍历 II199# 二叉树的右视图637# 二叉树的…

Hugging Face GGUF 模型可视化

Hugging Face GGUF 模型可视化 1. Finding GGUF files (检索 GGUF 模型)2. Viewer for metadata & tensors info (可视化 GGUF 模型)References 无知小儿,仙家雄霸天下,依附强者才是唯一的出路。否则天地虽大,也让你们无路可走&#xff0…

基于Coze平台实现抖音链接提取文案转小红书文案的智能体开发全流程解析

文章目录 引言:跨平台内容运营的AI解法实例最终效果1. 平台特性对比与转化需求分析1.1 用户画像与内容风格对比1.2 文案转化核心需求2. Coze平台技术架构解析2.1 Coze核心能力矩阵2.2 关键技术组件选型3. 智能体工作流设计3.1 完整处理流程3.2 关键节点说明4. 核心模块实现详解…

【低功耗 Power 学习专栏 -- Power domian 和 power rail】

文章目录 power rail(followpin) 和 Power domain1. Power Domain2. Power Rail3. Followpin4. Power Stripe5. IR Drop芯片中电源管理设计 举例 power rail(followpin) 和 Power domain followpin 指两部分,一个就是 STD cell 上下的 VDD, VSS。同时,f…

PopupMenuButton组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Sliver综合示例相关的内容,本章回中将介绍PopupMenuButton组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧,…

TiDB 分布式数据库多业务资源隔离应用实践

导读 随着 TiDB 在各行业客户中的广泛应用 ,特别是在多个业务融合到一套 TiDB 集群中的场景,各企业对集群内多业务隔离的需求日益增加。与此同时,TiDB 在多业务融合场景下的资源隔离方案日趋完善,详情可参考文章 《你需要什么样的…

CommonAPI学习笔记-2

一. 概述 ​ 这篇文章主要是想整理并且分析CommonAPI代码生成工具根据fidl和fdepl配置文件生成出来的代码的结构和作用。 二. fidl ​ 用户根据业务需求在fidl文件中定义业务服务接口的结构以及自定义数据类型,然后使用core生成工具传入fidl文件生成该fidl的核心…

ELK模块封装starter

文章目录 1.combinations-elk-starter1.目录结构2.log4j2-spring.xml 从环境变量读取host和port3.ELKProperties.java 两个属性4.ELKAutoConfiguration.java 启用配置类5.ELKEnvironmentPreparedListener.java 监听器从application.yml中获取属性值6.spring.factories 注册监听…

KNN算法:从思想到实现(附代码)

引言 K最近邻算法(K Nearest Neighbors, KNN)是一种简单而有效的机器学习算法,用于分类和回归问题。其核心思想基于“近朱者赤,近墨者黑”,即通过测量不同特征值之间的距离来进行分类或预测数值。本文将详细介绍KNN的…

学前端框架之前,你需要先理解 MVC

MVC 软件架构设计模式鼎鼎大名,相信你已经听说过了,但你确定自己已经完全理解到 MVC 的精髓了吗? 如果你是新同学,没听过 MVC,那可以到网上搜一些文章来看看,不过你要有心理准备,那些文章大多都…

第十八章 视图

目录 一、概述 二、语法 2.1. 创建视图 2.2. 查询视图 2.3. 修改视图 2.4. 删除视图 2.5. 示例 三、检查选项 3.1. CASCADED(级联) 3.2. LOCAL(本地) 四、视图的更新 五、视图作用 5.1. 简单 5.2. 安全 5.3. 数据独…

【MySQL】第一弹---MySQL 在 Centos 7环境安装

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1. 卸载不要的环境 2. 检查系统安装包 3. 卸载这些默认安装包 4. 获取mysql官方yum源 5. 安装mysql yum 源&am…

实验2 词法分析(一)

实验2 词法分析(一) [实验目的]: 1 . 熟悉给定的词法分析程序; 2 . 改进词法分析程序。 [实验内容]: 1.运行TESE编译演示.exe,观看词法分析程序的分析过程,理解词法分析的原理。并尝试在“TEST源程序输入框”输入一段…

【PyQt】PyQt工具栏

PyQt工具栏 在 PyQt 中创建工具栏主要涉及 QMainWindow、QToolBar 和 QAction 类 界面展示 基本示例 import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QAction from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qtclass MainWindow(QMainWindow…

STM32 串口收发数据包

接线图 HEX数据包接收 文本数据包接收 代码配置 发送HEX数据包 //存储发送或接收的载荷数据 uint8_t TX_Packet[4]; uint8_t RX_Packet[4];void Serial_SendPacket(void) {Serial_SendByte(0xFF);//发送包头Serial_SendArray(TX_Packet, 4);//发送4个载荷数据Serial_SendByte…

zabbix5.0.46版本源码安装

zabbix5.0.46版本源码安装 1.安装环境说明 本例中安装zabbix开源软件和zabbix运行所需的中间件和数据库apache、php和flyingdb,软件版本信息如下: 软件版本zabbix5.0.46apachehttpd-2.4.61aprapr-1.7.5apr-util1.6.3php7.3.24PostgreSQL16.6 主机操作…

[Android] IKTV专享版

[Android] IKTV专享版 链接:https://pan.xunlei.com/s/VOILXXuEd3ASo93c88UW79sxA1?pwd4tsw# 2025年2月最新免费K歌神器!家庭KTV软件,手机平板电视盒子电脑都可用