数据结构4——线性表3:线性表的链式结构
基本概念
链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。
这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点,所以我们要利用别的方法将这些数据元素衔接起来。而链式存储结构通过存储下一个内容的地址完成衔接。这样,依次通过衔接,就可以将整张表串联起来。我们将存储的内容叫做数据域,将衔接叫做指针域。数据域和指针域共同构成了结点。之后我们只要记录下第一个元素的地址,就可以找到多有链表存储内容,第一个元素的地址叫做头指针。而由若干个结点由指针链组成了链表。
头指针:指向链表中第一个结点的指针
头结点:在首元结点之前附设的一个结点,不储存实际所需要的信息
设置头结点的好处:
(1) 便于首元结点的处理:首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其他位置一致。
(2) 便于空表和非空表的处理:无论链表是否为空,头指针都指向头结点的非空指针,因此空表与非空表的处理也就统一了
首元结点:指向链表中存储第一个数据元素的结点
链表分类
单链表:结点只有一个指针域的链表
①不带头结点:
空表:头指针为空
②带头结点:
空表:头结点的指针域为空
双链表:结点有两个指针域的链表
循环链表:首尾相接的链表
链表的特点:
① 链表用一组物理位置任意的存储单元来存放线性表的数据元素,即逻辑上相邻的元素位置上不一定相邻。
② 访问时只能通过头指针进入链表,之后顺着结点一个个向后寻找。
顺序表->随机存取 链表->顺序存取
单链表
定义:
定义链表的两种方式:
Lnode *L; 或 LinkList L;
虽然两者的意思上差不多,但是对定义链表我们一般使用后者。
定义结点指针p两种方式:
Lnode *p;或 LinkList p;
虽然两者的意思上差不多,但是对定义结点我们一般使用前者。
例子:
基本操作的实现
单链表的初始化:
构造一个如图的空表
算法思路:
(1)生成新结点作为头结点 ,用头指针L指向头结点
(2)将头结点的指针域置空
判断链表是否为空:
算法思路:判断头结点指针域是否为空
单链表的销毁:
算法思路:从头指针开始,依次释放所有结点
单链表的清空:
与链表的校徽不同,清空链表后链表仍然存在,只不过链表中没有元素、成为空链表。
算法思路:依次释放所有结点,并将头结点指针域置空
注意点:由于单链表的清空不能把头结点删去,所以在链表结点的删除操作上比单链表的销毁更为复杂。
求单链表表长
算法思路:从首元结点开始,依次计数所有结点。
单链表的取值:(取单链表中的第i个元素)
算法步骤:
1、从第一个结点(L->next)顺链扫描,用指针 p 指向当前扫描到的结点,p 处置 p=L->next
2、j 做计数器,累计当前扫描过的结点数,j 初始值为1。
3、当 p 指向扫描到的下一个结点时,计数器 j+1。
4、当 j==i 时,p所指的结点就是要找的第 i 个结点。
单链表的查找:
算法步骤:
1、从第一个结点起,依次和e相比较
2、如果找到一个其值与e相等的数据元素,则返回其在链表中的位置或这地址
3、如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者NULL
① 按数值查找——返回值
② 按数值查找——返回序号
前后两者的差别是:
按数据内容查找增加了j的初始化并增加了j++记数功能、返回值变化。这些都只是在按数据内容查找的基础上增加了序号,本质没变。
单链表的插入:
算法步骤:
1、首先找到a(i-1)的存储位置p
2、生成一个数据域为e的新结点s
3、插入新结点:
① 新结点的指针域指向结点a(i)
s -> next = p -> next
② 结点a(i-1)的指针域指向新结点
p -> next = s
思考:① ② 两步可以直接交换吗?
不可以,因为先将a(i-1)指向s会导致p->next不能达到指向a(i)的效果,如果硬是要这样做,要多用一个指针指向a(i)
关于代码第83行 p=L 而不是 p=L->next 的解释:因为删除的结点有可能是就是第一个结点,指向Lnext会导致第一个结点无法删除。
单链表的删除:
算法步骤:
1、首先找到 a(i) 的存储位置p,保存要删除的 a(i) 的值
2、令p->next 指向 a(i+1)
3、释放结点空间
建立单链表:
头插法:元素插在链表的前部
尾插法:元素插在链表的尾部
总结
总结1:常用指针操作
指向头结点:p=L
指向首元结点:s=L->next
指向下一个结点:p=p->next
总结2:各操作时间效率分析:
查找:O(n)
插入和删除:O(n)
头插法/尾插法:O(n)
循环链表
定义:
头尾相接的链表,即表中最后一个结点的指针指向头结点,整个链表形成一个环。
优点:从表中任何一个结点出发均可以找到其它结点。
循环条件:
循环链表中没有空指针,其终止条件判断为p或者p->next是否等于头指针
p!=NuLL | p!=L |
---|---|
p->next!=NULL | p->next!=L |
单链表 | 单循环链表 |
基本操作的实现
带尾指针循环链表的合并(将Tb合并在Ta之后)
算法步骤:
1、p存表头节点 p=Ta->next
2、Tb表头连接到Ta表尾 Ta->next=Tb->next->next
3、释放Tb表头结点 delete Tb->next
4、修改Tb尾指针 Tb->next=Ta
双向链表
定义:
在单链表的每个结点里面再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链。
优点:方便查找前驱结点
双向链表结构定义:
对称性:p->prior->next = p = p->next->prior
基本操作实现
双向链表的插入:
双向链表的删除:
单链表、循环链表和双向链表的时间效率比较:
(1)查找表头几种链表时间复杂度相同。
(2)查找表尾结点使用循环链表时间复杂度小。
(3)查找前驱结点用双向循环链表时间复杂度最小。
顺序与链式比较
链式存储结构
优点:
① 结点空间可以动态申请和释放;
② 插入和删除操作时不需要移动大量元素;
缺点;
① 存储密度小,每个结点的指针域需额外占用存储空间;
② 是非随机存取结构,对任意一个结点的操作都要从头开始操作;
相关文章:

数据结构4——线性表3:线性表的链式结构
基本概念 链式存储结构用一组物理位置任意的存储单元来存放线性表的数据元素。 这组存储单元既可以是连续的又可以是不连续的甚至是零散分布在任意位置上的。所以链表中元素的逻辑次序和物理次序不一定相同。而正是因为这一点,所以我们要利用别的方法将这些…...
weblogic 忘记密码重置密码
解决:weblogic 忘记密码 weblogic安装后,很久不用,忘记访问控制台的用户名或者密码,可通过以下步骤来重置用户名密码。 版本:WebLogic Server 11g 说明:%DOMAIN_HOME%:指WebLogic Server 域(…...

安卓开发之动态设置网络访问地址
之前开发程序联测测接口的时候,因为要和不同的后台人员调接口,所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址,之后编译运行一下,才能测试。但要是换了个后台人员,或者同时和2个后台人员测接口…...

深度学习模型训练工作汇报(3.8)
进行数据的初始整理的准备 主要是进行伪序列字典的设置,以及训练数据集的准备。 期间需要的一些问题包括在读取文件信息的时候,需要跳过文件的第一行或者前两行,如果使用循环判断的话,会多进行n次的运算,这是不划算的…...

【ns-3】添加nr(5G-LENA)模块
文章目录前言1. 下载5G-LENA源代码2. 配置并重新构建ns-3项目参考文献前言 本篇以ns-3.37为例介绍如何在ns-3中添加nr(5G-LENA)模块 [1]。5G-LENA是一个由Mobile Networks group CTTC(Centre Tecnolgic de Telecomunicacions de Catalunya&a…...
(枚举)(模拟)(前缀和)(数组模拟哈希)(可二分)1236. 递增三元组
目录 题目链接 一些话 流程 套路 ac代码 题目链接 1236. 递增三元组 - AcWing题库 一些话 int f[N]; memset(f,0,sizeof f)影响不到f[N] 所以尽量不要对f[N]赋值,不要用f[N]操作 流程 //由三重暴力i,j,k因为三重暴力底下是分别用i和j,j和k作比较…...
mysql五种索引类型(实操版本)
为什么使用索引 最近学习了Mysql的索引,索引对于Mysql的高效运行是非常重要的,正确的使用索引可以大大的提高MySql的检索速度。通过索引可以大大的提升查询的速度。不过也会带来一些问题。比如会降低更新表的速度(因为不但要把保存数据还要保…...

微服务进阶之 SpringCloud Alibaba
文章目录微服务进阶🍓SpringCloud 有何劣势?🍓SpringCloud Alibaba 提供了什么?提示:以下是本篇文章正文内容,SpringCloud 系列学习将会持续更新 微服务进阶 🍓SpringCloud 有何劣势࿱…...
前端性能优化笔记2 第二章 度量
相关 Performance API 都在 window.performance 对象下 performance.now() 方法 精度精确到微妙获取的是把页面打开时间点作为基点的相对时间,不依赖操作系统的时间。 部分浏览器不支持 performance.now() 方法,可以用 Date.now() 模拟 performance.n…...

关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理
最近在写代码的时候,觉得每次new出来的对象都需要去delete好麻烦,于是直接把delete写到了析构函数中,在析构函数里面写了句delete this,结果调用析构函数的时候死循环了,不是很理解原因,于是去研究了一下。…...

一场以数字技术深度影响和改造传统实业的新风口,正在开启
当数字经济的浪潮开始上演,一场以数字技术深度影响和改造传统实业的新风口,正在开启。对于诸多在互联网时代看似业已走入死胡同的物种来讲,可以说是打开了新的天窗。对于金融科技来讲,同样如此。以往,谈及金融科技&…...

【LeetCode】13. 罗马数字转整数
题目链接:https://leetcode.cn/problems/roman-to-integer/ 📕题目要求: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即…...

2023/3/8集合之TreeSet HashSet简介 不含代码
TreeSet : 底层是由TreeMap维护的 无序的,不可重的 底层结构 : 红黑树(平衡二叉树) 特点 : 查询效率高,默认升序排序引用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景新增方法:新增了一些与比较大小相关的方法 遍历方式 1)foreach 2)iterator 1测试…...

【面试1v1实景模拟】面试中常见的Java关键字详解
笑小枫专属目录老面👴:Java中有哪些关键字老面👴:简单介绍一下 final 关键字老面👴:简单介绍一下 this、super 关键字老面👴:简单介绍一下 static 关键字老面👴ÿ…...

MySQL8.0.16存储过程比5.7.22性能大幅下降
MySQL8.0.16存储过程比5.7.22性能大幅下降 1、背景 从5.7.22迁移数据库到8.0.16,发现存储过程执行性能大幅下降。原来在5版本上执行只需要3-5秒,到8版本上居然要达到上万秒。 5版本: call Calculation_Week() OK 时间: 3.122s 8版本&#x…...

基于MATLAB的无线信道的传播与衰落(附完整代码与分析)
目录 一. 一般路径损耗模型 1. 1自由环境下路径损耗 1. 2 考虑实际情况 1.3 考虑阴影衰落 二. 代码仿真与理解 (1)函数文件 (2)函数文件 (3)主运行文件 三. 运行结果及理解 3.1 3.2 3.3 一. …...
SDX62如何查看Kernel版本和Operating System Version Patch Level
Kernel版本号方法一:adb shell登录,然后执行uname -a# uname -aLinux sdxlemur 5.4.180-perf #1 PREEMPT Fri Mar 3 04:24:42 UTC 2023 armv7l GNU/Linux方法二:内核源码查看,apps_proc/src/kernel/msm-5.4/Makefile 文件…...
001+limou+HTML——(1)HTML入门知识
000、本人编写前言 前言:本笔记来源于莫振杰的书《HTML、CSS、Javascript从零到一快速上手》,经过修改制成的自学笔记,本书很适合小白学习入门web的相关知识,你也可以先看看我从中学到了什么,再考虑是否去认真学习这本…...

使用Arduino Uno构建一个巡线机器人
使用Arduino Uno构建一个巡线机器人 原文 MX 巡线机器人(**LFR)**是一种简单的自主引导机器人,它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线。在本教程中,使用 Arduino Uno 和一些易于访问的组件构建黑线跟…...

【C++】类和对象(收尾)
文章目录成员变量初始化问题初始化列表explicit关键字static成员特性:友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时,编译器通过调用构造函数,给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...