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

数据结构知识点总结-线性表(3)-双向链表定义、循环单链表、、循环双向链表、静态链表、顺序表与链表的比较

双向链表定义

        单链表结点中只有一个指向其后继的指针,这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为 O(1) , 访问前驱结点的时间复杂度为 O( n ) 。

        为了克服单链表的删除缺点,引入了双向链表,双向链表结点中有两个指针 prior 和 next,分别指向其前驱结点和后继结点。

双链表中结点类型的描述如下:
typedef struct DNode {                // 定义双链表结点类型ElemType  data ;                  // 数据域struct  DNode  *prior , * next ;  // 前驱和后继指针
}DNode , * DLinkList ;

        双链表仅仅是在单链表结点中增加了一个指向其前驱的 prior 指针,因此,在双链表中执行按值查找和按位查找的操作和单链表相同。

        但双链表在插入和删除操作的实现上,和单链表有着较大的不同。这是因为“链”变化时也需要对 prior 指针做出修改,其关键在于保证在修改的过程中不断链。此外,双链表可以很方面地找到其前驱结点,因此不管前插入、后插入、前删除、后阐述,算法的时间复杂度均为为 O(1) 。

1)双向链表的插入操作

第一步: s->next = p->next ;   // 将结点 *s 插入到结点 *p 之后第二步: p->next->prior  = s ;第三步: s->prior = p ;第四步: p->next = s ;

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

(2)删除操作

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

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

p->next = q->next ;             // 上图中的第一步
q->next->prior = p ;            // 上图中的第二步
free( q ) ;                     // 释放结点空间

循环单链表

        循环单链表和单链表的区别在于,表中最后一个结点指针不是 NULL ,而改为指向头结点,从而整个链表形成了一个环,如下图所示:

        在循环单链表中,表尾结点 *r 的 next 域指向 L ,故表中没有指针域为 NULL的结点,因此,循环单链表的判空条件不是头结点的指针是否为空,而是它是否等于头指针

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

循环双向链表

        由循环单链表的定义不难推出循环双链表,不同的是在循环双链表中,头结点的 prior 指针还要指向表尾结点,如下图所示:

        在循环双链表 L 中,某结点 *p 为尾结点时, p->next = = L ; 当循环双链表为空表时,其头结点的 prior next 域都等于 L

静态链表

        静态链表是借助数组来描述线性表的链式存储结构,结点也有数据域 data 和 指针域 next ,与前面所讲的链表中的指针不同的是,这里的指针是结点的相对地址(数组下标),又称为游标。和顺序表一样,静态链表也要预先分配一块连续的内存空间。

        静态链表和单链表的对应关系如下图:

静态链表结构类型的描述如下:

# define MaxSize 50          // 静态链表的最大长度typedef  struct {        // 静态链表结构类型的定义ElemType  data ;         // 存储数据元素int  next ;              // 下一个元素的数组下标
} SLinkList[ MaxSize ] ;

        静态链表以 next == -1 作为其结束的标志。静态链表的插入、删除操作与动态链表相同,

        只需要修改指针,而不需要移动元素。总体来说,静态链表没有单链表使用起来方便,但是在一些不支持指针的高级语言(如 Basic)中 ,这又是一种非常巧妙的设计方法。

        顺序表和静态链表的物理结构(即存储结构)是相同的,在计算机内存中以数组的形式实现,是用一组地址连续的存储单元依次存储数据元素的线性结构,但两者的数据结构(逻辑结构)是不同的。

        静态链表不是顺序结构,这里的结构指的是逻辑结构,在逻辑结构层面,静态链表是链式结构。在物理层面,都采用顺序形式保存数据,因此物理结构、存储结构与线性表的顺序存储相同。

顺序表和链表的比较(数组与链表)

1)存取方式

顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。

2)逻辑结构和物理结构

采用顺序存储时,逻辑上相邻的元素,其对应的物理存储位置也相邻。

而采用链式存储时,逻辑上相邻的元素,其物理存储位置则不一定相邻,其对应的逻辑关系是通过指针链接来表示的,静态链表也是链式存储方式。

注意区别存取方式存储方式,存取方式指的插入删除

3)查找、插入和删除操作

           对于按值查找,当顺序表在无序的情况下,两者的时间复杂度均为 O( n ) ; 而当顺序表有序时,可采用折半查找,此时时间复杂度为O(lgN)

对于按序号查找,顺序表支持随机访问,时间复杂度为 O(1),而链表不支持随机访问,只能遍历链表,其平均时间复杂度为O(n) 。顺序表的插入、删除操作,平均需要移动半个表长的元素。链表的插入、删除操作,只需要修改相关结点的指针域即可。由于链表每个结点带有指针域,因而在存储空间上比顺序存储要付出较大的代价,存储密度不如顺序存储。

4)空间分配

顺序存储在静态存储分配情形下,一旦存储空间装满就不能扩充,如果再加入新元素将出现内存溢出,需要预先分配足够大的存储空间。预先分配过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。动态存储分配虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且若内存中没有更大块的连续存储空间将导致分配失败。

链式存储的结点空间只在需要的时候申请分配,只要内存有空间就可以分配,操作灵活、高效。

在实际中应该怎样选取存储结构?

1、基于存储的考虑

对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模。

2、基于运算的考虑

在顺序表中按序号访问 a[i] 的时间复杂度为O(1) ,而链表中按序号访问的时间复杂度为 O(n) ,所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表。

在顺序表中做插入、删除操作时,平均移动表中一半的元素,当数据表较长时,这一点是不应忽视的;在链表中做插入、删除操作时,虽然也要找插入位置,但是操作是比较简单的,从这个角度考虑链表优于顺序表。

3、基于环境的考虑

顺序表容易实现,任何高级语言中都有数组类型;链表的操作是基于指针的,相对来讲,前者实现较为简单,这也是用户考虑的一个因素。

总之,两种存储结构各有长短,选择哪一种由实际问题的主要因素决定。通常较稳定的线性表选择顺序存储,而频繁做插入、删除操作的线性表(即动态性较强)宜选择链式存储。

线性表总结结束,下一篇开始介绍栈和队列

相关文章:

数据结构知识点总结-线性表(3)-双向链表定义、循环单链表、、循环双向链表、静态链表、顺序表与链表的比较

双向链表定义 单链表结点中只有一个指向其后继的指针,这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为 O(1) , …...

JAVA学习-控制执行流程.for

在Java中,for循环是一种常用的控制执行流程的循环语句。它允许我们重复执行一段代码,直到满足指定的循环条件。 一、for循环的基本语法如下: for (初始化语句; 循环条件; 循环后操作) {// 循环体,要执行的代码} 其中&#xff0c…...

面试总结之JVM入门

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀你为什么要学习JVM?🎀JVM的作用 🎀JVM的构成(5大类)🏨1.类加载系统🐕类什么时候会被加…...

适配器模式(Adapter Pattern) C++

上一节:原型模式(Prototype Pattern) C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论 适配器模式(Adapter Pattern)是一种结构型设计模式,它允…...

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意:被 删除线 划掉的不一定不正确,只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…...

嵌入式系统在物联网中的应用与发展趋势

嵌入式系统在物联网中的应用与发展趋势 嵌入式系统在物联网中扮演着至关重要的角色,它们是连接物理世界和数字世界的桥梁,实现了物体之间的互联互通。以下是嵌入式系统在物联网中的应用与发展趋势的几个方面: 1. 应用领域 智能家居&#x…...

BTC网络 vs ETH网络

设计理念 BTC 网络 比特币是一种数字货币,旨在作为一种去中心化的、不受政府或金融机构控制的电子货币。其主要目标是实现安全的价值传输和储存,比特币的设计强调去中心化和抗审查。 ETH 网络 以太坊是一个智能合约平台,旨在支持分散的应…...

Android 开发一个耳返程序(录音,实时播放)

本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 AndroidManifast.xml2.编写耳返管理器3. 录音权限申请4. 使用注意 最后我还有一句话要说怕相思,已相思,轮到相思没处辞,眉间露一丝 Android 开发一个耳返程序 耳返程序是声音录入…...

提高办公效率:Excel在文秘与行政办公中的应用技巧

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在当今信息化时代,Excel作为一款常…...

Object.groupBy分组方法

在某些浏览器的某些版本中,此方法被实现为 Array.prototype.group() 方法。由于 web 兼容性问题,它现在以静态方法实现。 函数功能 提供的回调函数返回的字符串值对给定可迭代对象中的元素进行分组。返回的对象具有每个组的单独属性,其中包…...

从初步的需求收集到详细的规划和评估

综合需求分析建议 明确与细化用户故事 确保每个用户故事清晰、具体,包含角色、目标和成功标准。对用户故事进行优先级排序,以指导开发过程中的功能实现顺序。用户参与和原型制作 创建用户旅程图,以理解用户在使用产品或服务时的整体流程与体验。制作原型或草图,展示用户界面…...

石灰窑工艺流程以及富氧低氧燃烧技术

石灰窑的核心环节是煅烧过程,这是将石灰石转变为生石灰的关键步骤。煅烧反应是碳酸钙(CaCO₃)分解为氧化钙(CaO)和二氧化碳(CO₂)的过程。这一反应需要高温条件,通常在800摄氏度以上…...

LeetCode 2960.统计已测试设备

给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages ,表示 n 个设备的电池百分比。 你的任务是按照顺序测试每个设备 i,执行以下测试操作: 如果 batteryPercentages[i] 大于 0: 增加 已测试设备的计数。 将下标在 …...

vue中component is和keepAlive组合使用

component is用与动态渲染组件 组件基础 | Vue.js <template><div style"padding: 30px"><button click"change(1)">组件1</button><button click"change(2)">组件2</button><button click"chang…...

使用 Koltin 集合时容易产生的 bug 注意事项

来看下面代码&#xff1a; class ChatManager {private val messages mutableListOf<Message>()/*** 当收到消息时回调*/fun onMessageReceived(message: Message) {messages.add(message)}/*** 当删除消息时回调*/fun onMessageDeleted(message: Message) {messages.r…...

CKA认证,开启您的云原生之旅!

在当今数字化时代&#xff0c;云计算已经成为企业和个人发展的关键技术。而获得CKA&#xff08;Certified Kubernetes Administrator&#xff09;认证&#xff0c;将是您在云原生领域迈出的重要一步。 CKA认证是由Kubernetes官方推出的权威认证&#xff0c;它旨在验证您在Kuber…...

基于springboot+vue的抗疫物资管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root&#xff08;God用户类似LINUX的root&#xff09; 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…...

干洗行业上门预约解决方案,干洗店洗鞋店小程序开发;

互联网干洗店洗鞋店小程序,企业干洗方案,干洗行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发&#xff1b; 一、干洗店洗鞋店小程序核心功能介绍: 1.(支持上门取送、送货到店、寄存网点、智能衣柜四种下单方式) 用户下单-上门取…...

【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联

【Spring Boot 3】【JPA】@ManyToOne 实现一对多单向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学…...

Mathematica学习笔记收纳

笔记 可以关注官方公众号 帮助文件 https://reference.wolfram.com/language/index.html.zh 南京大学的介绍 https://oi.nju.edu.cn/Mathematica/listm.htm...

java反射高级用列(脱敏+aop)

ClassUtils 、FieldUtils、MethodUtils、ReflectionUtils高级 List<String> list = new ArrayList<>(); Class<?> userClass = ClassUtils.getUserClass(list.getClass()); System.out.println(Collection.class.isAssignableFrom(userClass)); Class<?…...

C++函数对象包装器function类详解

函数对象包装器是对函数的封装&#xff0c;为函数对象提供一个容器&#xff0c;一个封装。C中现有的可调用实体的一种类型安全的包装&#xff08;相对来说&#xff0c;函数指针的调用不是类型安全的&#xff09;&#xff0c;换句话说&#xff0c;函数对象包装器就是函数的容器。…...

SpringMVC 学习(八)之文件上传与下载

目录 1 文件上传 2 文件下载 1 文件上传 SpringMVC 对文件的上传做了很好的封装&#xff0c;提供了两种解析器。 CommonsMultipartResolver&#xff1a;兼容性较好&#xff0c;可以兼容 Servlet3.0 之前的版本&#xff0c;但是它依赖了 commons-fileupload …...

《低功耗方法学》翻译——附录A:睡眠晶体管设计

附录A&#xff1a;睡眠晶体管设计 休眠晶体管是PMOS或NMOS高VT晶体管&#xff0c;用于在待机模式下关闭设计部件的电源。PMOS休眠晶体管用于切换VDD电源&#xff0c;因此被称为“header开关”。NMOS休眠晶体管控制VSS电源&#xff0c;因此被称为“footer开关”。在90 nm及以下…...

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…...

spring boot 集成科大讯飞星火认知大模型

首先到官网https://console.xfyun.cn/services/aidoc申请key 一、安装依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…...

springboot/ssm高校宣讲会管理系统Java企业招聘宣讲系统web

演示视频&#xff1a;https://www.bilibili.com/video/BV1vz421R7cg/、 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&am…...

2024.02.23作业

1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …...

倒模专用制作耳机壳UV树脂:改性丙烯酸树脂

倒模专用制作耳机壳的UV树脂是经过改性的丙烯酸树脂&#xff0c;具有高透明度、高粘度、快速固化的特点。这种树脂可以通过紫外线光固化&#xff0c;快速形成坚硬的表面&#xff0c;并且具有较高的硬度和耐磨性&#xff0c;因此非常适合用于制作耳机壳。 此外&#xff0c;改性丙…...

工商网站注册公司/下载百度网盘app

原文地址为&#xff1a; python安装numpy和pandas最近要对一系列数据做同比比较&#xff0c;需要用到numpy和pandas来计算&#xff0c;不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了。首要条件&#xff0c;python版本必须是2.7以上。 linux首…...

广州做营销网站公司/拉新app推广接单平台

一&#xff0c; 密码最少长度为 6位 &#xff0c;并至少包含3种复杂类别的字符 &#xff08;如 Abc134 或者 abc12# 符合 如abc123 123 <>( 就不符合&#xff09; 二 密码最少长度为 8位 &#xff0c;并至少包含2种复杂类别的字符 &#xff08;如 Abc21334 或者 abcd123…...

大鹏附近网站建设/好搜seo软件

Build Tools 即构建工具是一个把源代码生成可执行应用程序的过程自动化的程序&#xff08;例如Android app生成apk&#xff09;。由Apache软件基金会所提供。基于项目对象模型&#xff08;缩写&#xff1a;POM&#xff09;概念&#xff0c;Maven利用一个中央信息片断能管理一个…...

网站建设买服务器还是数据库/最新足球新闻头条

由于组件提供的方式不同&#xff0c;所以安装的方法也是不一样的&#xff0c;下面就目前常见的各种形式的组 件的安装方法介绍一下。 1. 只有一个DCU文件的组件。DCU文件是编译好的单元文件&#xff0c;这样的组件是作者不想把源 码公布。一般来说&#xff0c;作者必须说明此…...

门户网站建设汇报/黄冈黄页88网黄冈房产估价

如何安装第三方模块&#xff1f;以及用过哪些第三方模块&#xff1f;1&#xff1a;pip包管理器2&#xff1a;源码下载-下载-解压-python setup.py build-python setup.py installre模块 正则匹配os模块 文件相关json模块 pick 网络传输time模块 记录时间hashlib模块 加密模块lo…...

企业网关官网/如何提高网站seo排名

最近「打工人」这个词火了那么问题来了你知道“打工人”用英语怎么说吗&#xff1f;“hit workers”&#xff1f;&#xff1f;&#xff1f;不对哦&#xff01;接下来就让我们看看“打工人”有哪些英语表达吧&#xff01;01 migrant workers“打工”最初的含义就是“外出打工人员…...