数据结构复习2

第二章 线性表

2.1线性表的定义和基本操作

线性表:一种逻辑结构,表示数据元素之间的一对一线性关系(如数组、链表、栈、队列等)。

2.1.1线性表的定义

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。
(其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为)

                                             

  • 几个概念:
    1. aiai是线性表中的“第i个”元素线性表中的位序。
    2. a1a1是表头元素;anan是表尾元素。
    3. 除第一个元素外,每个元素有且仅有一个直接前驱:除最后一个元素外,每个元素有且仅有一个直接后继。

  • 存储结构:
    1. 顺序存储结构:顺序表
    2. 链式存储结构:链表

2.2顺序表

顺序表:线性表的一种物理实现方式,通过连续内存空间存储元素(即数组实现的线性表)。

2.2.1顺序表的概念

  • 顺序表:用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
  • 顺序表的特点
  1. 随机访问,即可以在O(1)时间内找到第i个元素。
  2. 存储密度高,每个节点只存储数据元素。
  3. 扩展容量不方便。
  4. 插入删除操作不方便,需移动大量元素:O(n)。

2.2.2顺序表的实现

2.2.3顺序表的基本操作 

操作移动方向起始位置目的
插入从表尾开始向后移动最后一个元素防止覆盖未处理的元素
删除从删除位置开始向前移动删除位置的下一个直接覆盖,无需额外缓存

2.3线性表的链式表示

2.3.1单链表

  • 特点:
    优点:不要求大片连续空间,改变容量方便。
    缺点:不可随机存取,要耗费一定空间存放指针。

  • 基础操作总结 
操作核心思想时间复杂度边界条件
头部插入新节点指向原头节点,更新头指针O(1)空链表
尾部插入遍历到末尾,链接新节点O(n)空链表
指定位置插入找到前驱节点,调整指针O(n)前驱节点不存在
删除头节点头指针后移,释放原头节点O(1)空链表
删除指定节点找到前驱节点,跳过目标节点并释放O(n)目标节点不存在或为头节点
修改节点遍历找到目标节点,更新数据O(n)目标节点不存在
按值查找遍历链表,匹配数据O(n)无匹配
按位置查找遍历到指定索引O(n)索引越界
  •  单链表的建立

  1. Step 1:初始化一个单链表
  2. Step 2:每次取一个数据元素,插入到表尾/表头
  • 尾插法建立单链表
    平均时间复杂度O(n)
    思路:每次将新节点插入到当前链表的表尾,所以必须增加一个尾指针r,使其始终指向当前链表的尾结点。好处:生成的链表中结点的次序和输入数据的顺序会一致。
  • 头插法建立单链表
    平均时间复杂度O(n) 思路:新节点始终插入链表头部,最终链表顺序与输入顺序相反。
  •  链表的逆置:
    LNode *Inverse(LNode *L)
    {LNode *p, *q;p = L->next;     //p指针指向第一个结点L->next = NULL;  //头结点指向NULLwhile (p != NULL){q = p;p = p->next;q->next = L->next;  L->next = q;}return L;

    2.3.2双链表

双链表是一种比单链表更复杂的链式数据结构,每个节点包含两个指针,分别指向前驱节点(prev)和后继节点(next),从而支持双向遍历。

2.3.3循环链表 

循环链表是链表的变种,其特点是 尾节点的指针不再指向 NULL,而是指向头节点,形成一个环形结构。根据方向性,可分为 单向循环链表 和 双向循环链表

 2.3.4顺序表和链表的比较

【逻辑结构】

  • 顺序表和链表都属于线性表,都是线性结构

【存储结构】

  • 顺序表:顺序存储,使用数组存储,元素在内存中物理地址连续

    • 优点:支持随机存取,存储密度高
    • 缺点:大片连续空间分配不方便,改变容量不方便
  • 链表:链式存储,通过节点和指针链接,元素在内存中物理地址分散。

    • 优点:离散的小空间分配方便,改变容量方便
    • 缺点:不可随机存取,存储密度低

  •  核心区别
特性顺序表(数组实现)链表(指针实现)
存储方式连续内存空间非连续内存,通过指针链接节点
随机访问支持,时间复杂度 O(1)不支持,需遍历,时间复杂度 O(n)
插入/删除平均 O(n)(需移动元素)平均 O(1)(修改指针)
空间利用率无额外指针开销,但可能浪费预分配空间每个节点需存储指针,但动态扩容无浪费
内存分配静态(固定大小)或动态(可扩容)动态分配(按需申请释放)
缓存友好性高(连续内存,预加载效率高)低(内存分散,易引发缓存未命中)
适用场景高频查询、元素数量稳定频繁插入/删除、元素数量变化大
  • 操作效率 
操作顺序表链表
访问第i个元素O(1)(直接通过下标访问)O(n)(需从头遍历)
头部插入O(n)(需移动所有元素)O(1)(修改头指针)
尾部插入O(1)(若空间足够)O(1)(维护尾指针时)
中间插入O(n)O(1)(已知前驱节点时)
扩容O(n)(需迁移数据)O(1)(动态分配节点)

【内存管理】

  • 顺序表

    • 静态分配:大小固定(如C静态数组)。

    • 动态分配:可扩容但需复制数据(如C++ vector)。

  • 链表

    • 动态分配节点,无容量限制(除非内存耗尽)

【总结】

维度顺序表链表
本质数组指针链接的节点
核心优势访问快、缓存友好插入/删除高效、动态扩容
核心劣势插入/删除慢、扩容成本高访问慢、内存碎片化

2.4一些面试题 

2.4.1用一句话解释顺序表和链表

• 逻辑上相邻的元素在物理存储上也相邻(插入删除需要移动元素)

• 逻辑上相邻的元素物理上不一定相邻(插入删除不需要移动元素) 

2.4.2 头指针和头结点的区别?引入头结点的优点

区别: 头指针是指向链表第一个节点的指针,是访问链表的入口;而头结点是链表开头的一个附加节点,其数据域通常不存储业务数据。

注: 头结点的指针域指向线性表的第一个元素结点。

引入头结点的优点:

① 由于第一个数据结点的位置被存放在头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作保持一致,无需进行特殊处理。

② 无论链表是否为空,其头指针都是指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就得到了统一。

2.4.3如何判断链表有环

穷举遍历:设一个检测指针 k 和一个遍历指针 q,count 记录遍历指针 q 走的步数。遍历指针每走一步,检测指针 k 就走遍历指针 q 之前走过的节点,若发现相同的节点便说明有环,直到遍历节点 q 遍历完整个链表,即q = NULL 为止。时间复杂度O(n^2),空间复杂度O(1)

标记法:在结点中设置一个标记变量,每走一个结点,就判断一次。若 visit == true,则说明有环。反之,说明无环。时间复杂度O(n),空间复杂度O(n)

快慢指针:设置两个指针,一个慢指针 low 和一个快指针 fast。初始值 慢指针 low 指向第一个结点,快指针 fast 指向第二个结点。只要快指针不为空,则慢指针slow就先向后走一个。然后两轮处理快指针。只要未遍历完链表,则将快指针向后移动一个,并判断快慢指针是否相遇。一旦快慢指针相遇,则说明有环。反之,则说明无环。时间复杂度O(n),空间复杂度O(1)

set 集合大小变化:根据集合的去重特性来判断。每遍历一个结点,就将该结点加入集合。若加入该新结点后,集合大小不再发生变化,则说明集合中的该元素已存在,即说明存在环。倘若,遍历完所有结点,集合大小都能正常判断,则无环。时间复杂度O(n),空间复杂度O(n)

2.4.4 线性表包括了顺序表和链表,请比较它们的区别。★★

(1)存取(读写)方式

       顺序表可以顺序存取,也可以随机存取。

       链表只能顺序存取。

(2)逻辑结构与物理结构

       顺序存储:逻辑上相邻的元素,物理存储位置也相邻。

       链式存储:逻辑上相邻的元素,物理存储位置不一定相邻,对应的逻辑关系是通过指针链接来表示的。

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

       查找:

       对于按值查找,顺序表无序时,两者的时间复杂度均为O(n); 顺序表有序时,可采用折半查找,此时的时间复杂度为O(logn) 。

       对于按序号查找,顺序表支持随机访问,时间复杂度仅为0(1), 而链表的平均时间复杂度为O(n)。

       插入、删除:

       顺序表的插入、删除操作,平均需要移动半个表长的元素。

       链表的插入、删除操作,只需修改相关结点的指针域即可。由于链表的每个结点都带有指针域,故而存储密度不够大。

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

空间转录组benchmark 相关 读完scGPT spatial 和 空间单细胞基因乳房细胞数据集文章之后

文章目录 ✅ 空间转录组测序方式总体划分🧬 成像型空间转录组(Imaging-based ST)原理:技术代表 & 特点:优点:局限: 🧬 测序型空间转录组(Sequencing-based ST&#x…

清理华为云服务器内存使用率

这里写自定义目录标题 一、正确终止进程:不要带尖括号二、看清楚谁“真吃”了内存三、临时清掉缓存(谨慎用)四、长期优化1. 给系统加个 Swap2. 调整 MySQL 内存配置3. 水平/垂直扩容4. 告警 总结与下一步 华为云的“内存使用率”默…

Go 语言中的 package 和 go modules

1、package 的定义和导入 在任何大型软件项目中,代码的组织和管理都是至关重要的。Go 语言通过 包(Package) 的概念来解决这个问题,它不仅是代码组织的基础,也是代码复用的关键。本文将深入探讨 Go 语言中包的定义、规…

C#语言入门-task4 :C#语言的高级应用

C# 作为一门现代化、面向对象的编程语言,在企业级应用、游戏开发、移动应用、云计算等领域有着广泛的应用。以下是 C# 语言的一些高级应用场景和技术方向: 一、高级语言特性与编程范式 1. 异步编程(Async/Await) 应用场景&…

FastAPI vs Flask vs Django:Python Web框架全面对比

Python 作为最受欢迎的编程语言之一,其 Web 开发生态极为丰富。FastAPI、Flask 和 Django 是当前主流的三大 Python Web 框架,各有千秋。本文将从架构设计、开发效率、性能表现、生态支持、适用场景等方面,全面对比这三大框架,帮助…

如何从零开始掌握Pandas的DataFrame使用

视频演示 如何通过实例学习Pandas DataFrame的创建与数据访问 🧩 理解 Pandas DataFrame:数据分析的核心结构 Pandas 是 Python 中用于数据分析与处理的主力库,而 DataFrame 是 Pandas 最常用的二维表格数据结构。我们可以将其想象成一个 Ex…

LaTeX下载与实践入门指南

LaTeX下载与实践入门指南 简单来说,LaTeX 是一种以代码驱动的排版系统。和 Word 那种所见即所得(WYSIWYG)的编辑方式不同,LaTeX 更像是你写代码、它帮你生成精美排版。你写的不是文字排版,而是一种“结构化内容&#…

Java--数组

目录 1.1 介绍:数据可以存放多个同一类型的数据。 1.2 排序: 冒泡排序法: 1.3 查找 1. 顺序查找 2. 二分查找 二维数组: 杨辉三角: 1.1 介绍:数据可以存放多个同一类型的数据。 数组的引用&#xf…

地址簇与数据序列

深入理解IP地址与端口号:网络通信的基础 IP地址:互联网的门牌号 IP地址(Internet Protocol Address)是分配给网络中每台设备的唯一标识符,就像现实世界中的门牌号一样。在计算机上,一个网卡对应一个IP地址…

中学数集相等概念凸显无穷集不可~其真子集——初数一直将不是N的真子集误为⊂N

中学数集相等概念凸显无穷集不可~其真子集——初数一直将不是N的真子集误为⊂N 黄小宁 [摘要]证明了初等数学应有几何起码常识:当且仅当平移的距离0时才能使平移前、后的点集(元点不少于两个)重合。从而表明初中的直线公理使中学…

常规层叠设计需要了解的板材知识

常规层叠设计需要了解的板材知识: 层叠设计的第一个关键要点就是要了解板材的基本知识。 观点: PCB是由铜箔(“皮”)、树脂(“筋”)、玻璃纤维布及其他功能性补强添加物(“骨”)组成。层叠设计时,要对“筋骨皮”的材料特性参数有一定了解。 先来看看“皮”,在对常…

Zabbix 监控VMware Vcenter

本次实验测试如何在Zabbix中添加Vcenter监控对象实现对VMware虚拟化平台的监控。 一、测试环境 1、Zabbix服务器配置: Zabbix 版本: Zabbix 7.0.11 LTS 操作系统: Ubuntu 24.04 数据库: MySQL 8 Web 服务器: Apache IP:192.168.1.242 2、监控目标…

链表最终章——双向链表及其应用

———————————本文旨在交流探讨计算机知识,欢迎交流指正———————————— 上一章,我们介绍了链表的循环扩展,但是,单向链表毕竟是单向查询的,就算是经过循环来查找,终究是效率偏低&#x…

智能体的5个核心要素

文章目录 如何看待智能体智能体的发展阶段国内大模型厂家推出的智能体智能体的应用领域智能体架构智能体的核心要素1. ​​认知中枢(大模型)​​🧠 2. ​​记忆系统(Memory)​​🛠️ 3. ​​规划与决策&…

QUdpScoket 组播实现及其中的踩坑点记录

QUdpScoket 组播实现及其中的踩坑点记录 QUdpSocket要想组播需要打开MulticastTtlOption配置项,否则无法生效,亲身踩坑经历 m_socketnew QUdpSocket(this);m_socket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);确定一个组播地址&…

250627-结合Guacamole与FRP访问CentOS-Stream-9及Windows10

A. FRP的配置 A.1 FRP在CentOS中的配置 frps.toml [common] bind_port 7000 bind_addr 0.0.0.0dashboard_port 7500 dashboard_user admin dashboard_pwd admin启动:./frps -c frps.toml frpc.toml [common] server_addr 123.456.789.98 server_port 700…

环保法规下的十六层线路板创新:猎板 PCB 如何实现无铅化与可持续制造

在全球环保法规趋严的背景下,十六层线路板作为高端电子设备的核心组件,正面临无铅化与可持续制造的双重挑战。猎板 PCB 凭借材料革新与工艺升级,构建了从焊料到基材、从生产到回收的全链路绿色体系,为行业树立了合规标杆。 一、无…

OpenLayers 拖动旋转和缩放

前言 在 OpenLayers 框架中已经封装了很多便利的交互控件,可以做到开箱即用,非常方便。像拖动缩放、绘制、选择等交互控件可以供开发者直接使用。本篇给大家介绍拖动旋转交互控件 1. 旋转控件简介 此控件通过按住shift键结合鼠标左键或右键进行使用。在…

element ui Cascader 级联选择器 处理未全选时去除父节点值,选中父节点时去除子节点值

目前我这边的需求时:当用户的选择,只保留最顶层的选中节点 如果选中了父节点,则移除其所有子孙节点以及它的祖先节点(因为选中父节点代表选中整个分支,所以不需要再显示子节点;同时,如果存在祖…

uniapp实现远程图片下载到手机相册功能

在 UniApp 中实现点击下载图片到相册的功能&#xff0c;需要以下几个步骤&#xff1a; 1. 下载图片到本地&#xff08;uni.downloadFile&#xff09; 2. 将图片保存到相册&#xff08;uni.saveImageToPhotosAlbum&#xff09; 完整代码示例&#xff1a; <template>&l…