数据结构之线性表(一般的线性表)

news2024/12/24 13:55:40

前言

接下来就开始正式进入数据结构环节了,我们先从线性表开始。

线性表

线性表(linear list)也叫线性存储结构,即数据元素的逻辑结构为线性的数据表,它是数据结构中最简单和最常用的一种存储结构,专门存储“一对一”逻辑关系的数据。何为“一对一”?即除去第一个和最后一个数据元素,其他元素均首尾相通,第一个元素只有下家没有上家,最后一个元素只有上家而没有下家。
此外还有一种特殊的线性表——循环链表,其将尾指针指向首元素从而形成了一个闭环。存储在同一个线性表中的数据,其类型必须一致,即要么都是整型,要么都是字符串型。如果从数据结构的逻辑层次上讲,那么线性表还可以进一步细分为一般线性表和受限线性表。

一般的线性表

一般线性表可分为顺序表和链表,链表又可分为单向链表、双向链表和循环链表等,如下图所示。
在这里插入图片描述

1. 順序表

如下图所示。
在这里插入图片描述

顺序表(Sequential List) 也叫顺序存储结构,即将数据依次存储在连续的物理空间中,是不是发现这样的结构很熟悉?是的,顺序表最底层的结构即为我们常听说的数组(Array),而针对顺序表的任何操作(包括查找、添加和删除等)都是基于遍历。

一般情况下,顺序表申请的存储容量应大于顺序表的长度。

2. 链表

链表(Linked List)也叫链式存储结构,即将数据依次存储在分散的物理空间中,但其逻辑关系仍是连续的,如下图所示。
在这里插入图片描述
与顺序表不同,链表的数据元素是随机存储的,因此其物理存储空间比较散乱,但其凭借着一条连接各个数据元素的线条,使数据元素之间保持着一定的逻辑关系。
链表还可细分为单向链表、双向链表和循环链表等,接下来让我们逐一进行学习。

(1)単向链表

单向链表也叫单链表,是链表中最基础的类型,通过单链表开启对于链表的学习,显然是明智的。
上面我们讲到,链表的物理存储空间是不连续的,但逻辑关系却可以保持。这是如何实现的呢?答案是指针域。单链表为每个元素配备了一个指针域(next),指向自己的直接后继元素。

直接后继元素即目标元素后相邻的一个元素,相似的还有后继元素、前驱元素和直接前驱元素。

因此,单链表的数据元素结构应该包含数据域(data)和指针域(next),它们也称为节点,如下图所示。
在这里插入图片描述
整个单链表的结构如下图所示
在这里插入图片描述
然而完整的链表结构应该有头节点、头指针和首元节点,如下图所示。
在这里插入图片描述

  • 头指针:指向链表第一个节点(头节点或首元节点)的指针,用于指明链表的位置;
  • 头节点:链表第一个不包含数据的空节点,不是必需的;
  • 首元节点:链表第一个包含数据的节点,不过作用不如头节点大。

若有头节点,则头指针指向头节点;若无头节点,则头指针指向首元节点。

单链表中的动态和静态

在单链表中又有动态和静态之分。
动态链表也叫动态单链表,很多时候人们还会把它直接称作单链表,这也导致很多人都会把链表的关系树混淆。不过,动态链表确实就是单链表,因此在后面的文章中笔者将会把动态链表称为单链表。
我们已经讲解了顺序表和单链表,而静态链表可以理解为顺序表和单链表的结合体。
静态链表融合了顺序表和单链表的优点——既可快速访问元素,又可快速增加和删除元素。这是怎么做到的呢?
在静态链表中,数据依旧存储在数组中(和顺序表一样),物理空间也是连续的(和顺序表一样),但存储位置是随机的(和单链表一样),元素的逻辑关系则靠“游标”(指针)进行维持(和单链表一样)。
是不是感觉有点懵?别急,我们继续往下看。假设我们创建了一个长度为5的静态链表,它的基础结构如下图所示。
在这里插入图片描述
上图所示的是一个空数组。我们进一步剖析一下:一个静态链表,应该是由数据链表和备用链表组成的才对。为了方便理解,我们进一步假设这个长度为5的静态链表存储的是数据{1,2,3},则存储状态可能如下图所示。

通常,备用链表表头指向a[0]的位置,而数据链表表头指向 a[1]的位置。

在这里插入图片描述
这里的数据链表即为存储数据的链表。该链表的每个节点除了包含所存储的数据(如1、2、3)之外还拥有一个整型变量,这个变量称为游标变量,用于标记该节点的直接后继节点的位置下标(如2、4、0)。而备用链表则是记录空闲位置的链表。通过备用链表,我们可以清晰、便捷地知道目标链表是否还有空余位置,还可以快速又准确地找到空余位置的物理地址。静态链表的完整结构如下图所示。
在这里插入图片描述
在这个例子里,数据链表依次连接的是 a[1]、a[2]、a[4],而备用链表依次连接的是a[0]、a[3]。在静态链表中,a[0]位置默认是不存储数据的,若 a[0]位置有数据,则说明该数组已满,即链表已满。
让我们将数据链表和备用链表结合起来,便可以得到如上图所示存储{1,2,3}的静态链表的完鏊结构。

  • 当想要查找元素时,便从数据链表的a[1]位置开始遍历,毕竟我们只知道a[0]和 a[1]的地址;
  • 当想要修改元素时,我们依旧从数据链表的a[1]位置开始遍历,找到目标元素后直接修改它的数据域即可,游标不用修改;
  • 当想要增加元素时,默认插入位置为备用链表a[0]的直接后继节点,这样就不用移动游标,时间复杂度仅为 O(1);
  • 当想要删除元素时,我们先找到目标元素,将其直接前驱节点的游标指向其直接后继节点,然后删除该节点,并将空余位置存放于备用链表中,方便下次使用。
(2)双向链表

有单向链表则必有双向链表,双向链表也叫双链表。无论是我们学过的单链表还是静态链表,节点中都只包含一个指针(游标),用于指向直接后继节点,这确实解决了最基本的“一对一”问题。
当我们编写算法需要多次查找目标节点的前驱节点时,如果使用单链表的话问题就严重了——效率超低!因为单链表是“一根筋的憨憨”,更适合“从前往后”进行遍历。
那怎么办呢?这时候双链表就诞生了。双链表的存储结构和单链表基本一致,只是一个箭头变成了两个而已,这里就不赘述了。双链表的节点结构如下图所示。
在这里插入图片描述
双链表的每个节点都有一个数据域和两个指针域,prior 指针指向直接前驱节点,next指针指向直接后继节点。

虽然双向链表的逻辑关系是双向的,但通常情况下,头指针依旧只有一个。

(3)循环链表

循环链表,即环状链表,只是把单链表最后一个节点的指针指向了第一个节点(头节点或首元节点),形成一个头尾相接的环状链表,像个圆圈一样,因此也被称为“环”。
循环链表之下还有单向循环链表和双向循环链表。
单向循环链表:与动态单链表一样,单向循环链表也经常被简单称为循环链表。为了方便大家理解,画了一个循环链表的整体结构图,如下图所示。
在这里插入图片描述
双向循环链表:有了对从单链表到循环链表变形过程的认知,相信双向循环链表也就不难理解了。这里就作为作业,读者可尝试一下把双向循环链表的整体结构完整地画出来。

拓展

说到循环链表,提到了环,就必然会想到约瑟夫环。大家可以试着实现约瑟夫环,以加深自己对链表的理解。

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

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

相关文章

springboot快速开始

创建和配置 下面是创建和配置项目, 可以看看, 但是本文重点是怎么开web接口和连接数据库, 所以可以直接从gitee上下载我配好的 gitee 创建项目 java配置 idea里可以下载java maven maven用来帮你管理项目需要的包(库), 不过要下载快需要配镜像, 请查阅网络资料 添加依赖…

缓存高并发问题

Redis 做缓存虽减轻了 DBMS 的压力,减小了 RT,但在高并发情况下也是可能会出现各种问题的。 缓存穿透 当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透”缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发…

处理Eclipse验证读条问题

打开Eclipse后下方一直读条加载验证,强迫症受不了。 依靠互联网自动加载失败,手动放入缺失的文件,我这里是mybatis的一个dtd文件缺失。 打开Eclipse-XML下的catalog,选择缺失的文件,保存。 可能需要重启Eclise

代码随想录刷题题Day41

刷题的第四十一天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day41 任务 ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇 1 两个字符串的删除操作 583. 两个字符串的删除…

详解线性分组码(linear code)

目录 一. 介绍 二. 线性分组码 三. 生成矩阵 四. 对偶编码 五. 校验矩阵 六. 陪集编码 七. 小结 一. 介绍 Low-density parity-check,简称LDPC码,翻译为低密度奇偶校验码。 我们所熟悉的LDPC码就是一个典型的线性分组码(linear bloc…

HarmonyOS(十三)——详解自定义组件的生命周期

前言 自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。 下图展示的是被Entry装饰的组件生命周期: 今…

大数据学习之Flink算子、了解DataStream API(基础篇一)

DataStream API (基础篇) 注: 本文只涉及DataStream 原因:随着大数据和流式计算需求的增长,处理实时数据流变得越来越重要。因此,DataStream由于其处理实时数据流的特性和能力,逐渐替代了DataSe…

macOS跨进程通信: Unix Domain Socket 创建实例

macOS跨进程通信: Unix Domain Socket 创建实例 一: 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket, 和类Unix 系统(包括Mac)独有的 Unix Domain Socket(UDX)。 Tcp So…

基于SpringBoot Vue家政服务预约平台系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

Midjourney 提示词入门 | 提示词格式 特点如何写好自己的提示词?进阶技巧

文章目录 1 Prompt格式2 文本提示词的基本要求3 好的文本提示词的特点 上一节我们初步了解了Midjourney的使用 那么在使用过程中最重要的是通过Prompt告知Midjourney怎么画 因而高效写Prompt非常重要~ 先来了解一下Prompt基本格式 1 Prompt格式 /imagine Text_prompt如下图…

【数据结构与算法】4.自主实现单链表的增删查改

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

开始学习Vue2(脚手架,组件化开发)

一、单页面应用程序 单页面应用程序(英文名:Single Page Application)简 称 SPA,顾名思义,指的是一个 Web 网站中只有唯一的 一个 HTML 页面,所有的功能与交互都在这唯一的一个页面内完成。 二、vue-cli …

JVM虚拟机面试题

一.JVM组成 1.JVM是什么 2.什么是程序计数器 3.java堆 4.虚拟机栈 5.方法区 6.直接内存 二.类加载器 1.什么是类加载器,类加载器有哪些 2.双亲委派模型 3.类装载的执行过程 三.垃圾回收 1.对象什么时候可以被垃圾器回收 2.JVM垃圾回收算法 3.JVM分代回收 4.JVM有哪些垃圾回收…

vcenter7.0

Vcenter7.0简易详细安装图解 环境:Windows server 2016 镜像:VMware-VCSA-all-7.0.3-20395099.iso 1.前提配置一个静态IP地址(192.168.80.120)和关闭防火墙 2.配置一个dns(这里做的是一个不加域的) 第一步…

数据仓库-相关概念

简介 数据仓库是一个用于集成、存储和管理大量数据的系统。它用于支持企业决策制定过程中的数据分析和报告需求。数据仓库从多个来源收集和整合数据,并将其组织成易于查询和分析的结构。 数据仓库的主要目标是提供高性能的数据访问和分析能力,以便…

不就业,纯兴趣,应该自学C#还是JAVA?

不就业,纯兴趣,应该自学C#还是JAVA? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&#xff…

OpenHarmony 鸿蒙使用指南——概述

简介 OpenHarmony采用多内核(Linux内核或者LiteOS)设计,支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时,如何能够让设备驱动程序在不同内核间平滑迁移,消除驱动代码移植适配和维护的负担,…

2024年游泳骨传导耳机该怎么选?什么牌子的游泳耳机好?

游泳是一项非常有趣的运动,但是如果你想在水中听音乐或者收听其他音频内容,就需要一款专业的游泳骨传导耳机。那么,我们应该如何选择游泳骨传导耳机呢?接下来跟我一起看看这四款性能不错的游泳耳机吧。 1. 南卡骨传导游泳耳机 推…

【赠书第18期】人工智能B2B落地实战:基于云和Python的商用解决方案

文章目录 前言 1 方案概述 2 方案实施 2.1 云平台选择 2.2 Python环境搭建 2.3 应用开发与部署 2.4 应用管理 2.5 安全性与隐私保护 3 方案优势与效益 4 推荐图书 5 粉丝福利 前言 随着云计算技术的快速发展,越来越多的企业开始将业务迁移至云端&#x…

spring mvc Rest风格

南城余的Java学习 专栏收录该内容 70 篇文章0 订阅 我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发&#xf…