神奇的线性表(链表)

news2024/11/15 21:35:27

目录

神马是链表

链表的分类

单向链表

 链表的常用操作

查找操作

插入操作 

 删除操作

 链表与数组

数组的插入

数组的删除 

链表的应用

 尾声


神马是链表

记得很久很久以前…我们学习过数组, 数组是在内存中一段连续的存储空间, 可以在常数时间内访问任意位置的元素, 但是数组也有缺点, 无法做到快速的插入和删除, 因为空间是连续且固定的, 想要在p位置插入/删除一个元素, 则 p之后的位置的元素都需要移动。

为了能够在常数时间内实现元素的插入和删除, 我们引入链表这种数据结构

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

那么非连续、非线性有什么含义呢?这表明链表的内存是不连续的,前一个元素存储地址的下一个地址中存储的不一定是下一个元素。链表通过一个指向下一个元素地址的引用将链表中的元素串起来。(嗯,这东西真的6啊)

接着,我们来做一道小小的练习题

线性表若采用链表存储结构,要求内存中可存储单元地址()

 A.必须连续

 B.部分地址必须连续

 C.一定不连续

 D.连续不连续均可

答案:D

解析:数组的存储空间要求连续的内存;线性表不要求连续的内存,当然连续的内存也可以。

链表有哪些呢,请看

链表的分类

分类描述
单向链表每一个节点包含了数据块和指向下一个节点的指针
双向链表每一个节点包含了数据块和指向下一个节点的指针以及指向前一个节点的指针

咋们先来看单向链表:

单向链表

单向链表是最简单的链表形式。我们将链表中最基本的数据称为节点 (node) ,每一个节点包含了数据块(data)和指向下一个节点的指针(next),链表有一个头节点,图中以 head 表示。可以看出, ℎhead 指向第一个元素,第一个元素的 next 又指向第二个元素……直到最后一个元素,该元素不再指向其他元素,它称为表尾,它的 next 为空(NULL),链表到此结束。

可以看到,要找链表中的某一元素,必须先找到上一个元素,根据它提供的下一个元素的地址才能找到下一个元素。如果不提供头指针,则整个链表都无法访问。链表如同一条铁链一样,一环扣一环,中间是不能断开的。

我们使用数组模拟的方法来学习链表。我们创建一个结构体, 这个结构体有两个 𝑖𝑛𝑡int 型的变量, 分别是data 和next ,data 就是链表当前节点存储的数据,next 指向下一个节点的节点编号(在数组中的编号,这样可以避免使用指针)(讲的真好!!~~)。

die码:

struct node{  //next即后面节点的编号,data就是需要维护的数据
    int next,data;
}a[10000];
int head;    //head即头指针
//head节点是头结点, 不存储数据, 作用只是用来找到链表的第一个节点。

 链表的常用操作

操作描述
查找找到符合条件的节点
插入添加一个新节点
删除删除一个存在的节点

查找操作

如何根据给出的数据,找到链表中符合条件的节点呢?需要从头节点开始,逐个向后遍历节点,比较 p 的 data 同待查找的数据是否相同,相同则返回当前节点。

struct node{  //next即后面节点的编号,data就是需要维护的数据
    int next,data;
}a[10000];
int head; //head即头节点的编号
node find(int value){
    int p=head; //从
    while(a[p]!=NULL){
        if(value==a[p].data)
            return a[p];
        p=a[p].next;
    }
    return NULL;
}

插入操作 

我们先通过一个选择题了解插入操作

在一个单链表中,若要在p节点后,插入一个q节点,则执行(    )

A. p -> next = q -> next; q -> next = p;

 B.q -> next = p -> next; p -> next = q;

 C.p -> next = q -> next; p -> next = q;

 D.q -> next = p -> next; p = q;

 答案:B

分析思路:

若要在p节点后,插入一个q节点,则需要:q -> next = p -> next;    p -> next = q;

链表如何实现插入操作呢? 如果我们想在第 p 个节点之后插入一个新节点, 因为我们不能像使用数组一样直接访问下标, 链表只能头遍历, 直到走到第 p 个节点。

到达第 p 个节点之后, 我们需要先将新节点的next 指向当前 p 节点next 指向的节点, 再将 p 节点的next 指向这个新的节点 

struct node{ //next即后面节点的编号,data就是需要维护的数据
    int next,data;
}a[10000];
int head;  //head即头节点的编号
//注意要使用引用传递
void insert(int newIndex, node &pre){
    a[newIndex].next=pre.next;
    pre.next=newIndex;
}

 删除操作

删除与插入操作类似, 如果我们想要删除第 p 个节点, 那么我们先要从头遍历到第p−1 的节点, 将p−1 节点的next 指向 p 的next ,同时,那么第 p 个节点就从当前的链表中移除了。 

struct node{    //next即后面节点的编号,data就是需要维护的数据
    int next,data;
}a[10000];
int head;    //head即头节点的编号
void delete(node &delNode, node &pre){
    pre.next=delNode.next
}

 链表与数组

操作链表数组
查找从头节点开始查找从下标 00 开始查找
插入很快,因为只需要修改 𝑝𝑟𝑒pre 以及新节点的 𝑛𝑒𝑥𝑡next 编号所有后面的节点都要向后移 11 位
删除很快,因为只需要修改 𝑝𝑟𝑒pre 的 𝑛𝑒𝑥𝑡next 编号所有后面的节点都要向前移 11 位

数组的插入

数组的删除 

链表的应用

由于链表存储不连续,一般来讲,访问效率低于数组。但链表的删除插入效率高。

课堂练习:队列复原

小瓜现在让1到n这n个整数排成一列,但是他只告诉你每个整数的后面那个数是什么(最后一个整数的后面那个数是0),请你帮忙复原这个队列。

输入格式

第一行一个整数n(n<=100000),表示有n个整数。 接下来n行,每行两个数i,j,表示排在整数i后面的那个数是j。

输出格式

n行,每行一个整数,表示完整的队列。

输入样例

4
1 3
2 4
3 2
4 0

输出样例

1
3
2
4

思路:

用链表记录下每个节点的next ,然后从头节点开始,遍历整个链表,并输出值。

如何找到头节点呢?因为是头节点,所以没有任何节点的next 指向头节点。可以开一个 bool 数组来记录,或者用原来的 data 来存储每个节点的 pre (前一个节点的编号),这样便形成了一个双向链表,如果某个节点的 pre 为0,则是头节点。

 尾声

咱们今天的链表就讲到这里,下篇博文再见👋

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

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

相关文章

逻辑分析仪解析SPI数据

工具为梦源逻辑分析仪&#xff0c;本次测试的是ST7789v屏幕驱动 接线方面一共需要三根线&#xff08;MOSI&#xff0c;SCL&#xff0c;GND&#xff09; SCL PA5 MOSI PA7 DSView上位机配置 通道按照接线选择&#xff0c;这个一定要对应上 COPL CPOH按照SPI实际配置来&#x…

生成模型(四):扩散模型(Diffusion Models)

本文大纲如下&#xff1a; 生成模型种类 到目前为止&#xff0c;我已经写了三种类型的生成模型&#xff0c;[[生成模型-GAN]]、[[生成模型-VAE]]和[[生成模型-Flow based model]]。 它们在生成高质量样本方面显示出巨大的成功&#xff0c;但每一种都有其自身的一些局限性。下…

基于Python的GUI图形用户界面编程

【无限嚣张&#xff08;菜菜&#xff09;】&#xff1a;hello您好&#xff0c;我是菜菜&#xff0c;很高兴您能来访我的博客&#xff0c;我是一名爱好编程学习研究的菜菜&#xff0c;每天分享自己的学习&#xff0c;想法&#xff0c;博客来源与自己的学习项目以及编程中遇到问题…

非零基础自学Golang 第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.2 HTTP客户端17.2.4 发起POST请求第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求 在上一小节我们使用了http.NewRequest来创建一个请求&#xff0c;http.NewRequest有三个参数&#xff0c;第…

web前端-javascript-String字符串的相关方法

文章目录字符串的相关方法1. 底层字符串保存2. 方法1) length 属性 获取长度2) charAt() 获取指定字符3) chartCodeAt() 获取指定字符编码4) String.formCharCode() 根据编码获取字符5) concat() 连接字符串6) indexOf() 是否含有指定内容7) lastIndexOf() 是否含有指定内容8) …

哈斯机床联网

一、设备信息确认 1、确认型号 哈斯的数控面板共有两种情况。 老版本&#xff1a; 新版本&#xff1a; 注&#xff1a;老版本通讯为串口&#xff0c;新版本通讯为网口。 2、确认通讯接口 1、数控面板的后面 老版本的串口一般都会引出在正后面的左侧位置&#xff0c;上面有…

结构型模式之代理模式(八)

常说的设计模式是23种设计模式&#xff0c;分为3大类&#xff1a; 创建型模式5种&#xff1a;工厂方法、抽象工厂、单例、建造者、原型结构型模式7种&#xff1a;适配器、代理、桥接、装饰者、外观、享元、组合行为型模式11种&#xff1a;模板方法、解释器、策略、观察者、迭代…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.1 单元测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.1 单元测试第15章 Go命令行工具 15.5 代码测试(test) go test命令用于对Go语言编写的代码包进行测试。 可以指定要测试的文件&#xff0c;也可以直接对整个包进行测试&#xff0c…

[Java实战]Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]

Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]1.Squaretest是什么?2.如何配合JUnit使用...?3.生成的java文件长啥样?4.如何生成和使用?5.如何用生成的XXXTest.java文件进行单元测试...6.观察结果7.单元测试成功8.源码地址为了好好写单元测试,提…

Dell inspiron 7580硬件升级_更换电池加内存条移动硬盘

文章目录前言硬件升级确认硬件型号参数拆机验证硬件更新后记前言 手上的笔记本[Dell inspiron 7580]用了几年了&#xff0c;还是刚上大学的时候买的&#xff0c;现在感觉这个配置用起来有点吃力了&#xff0c;稍微更新一下配置准备再战两年┭┮﹏┭┮ Light em up, light em u…

参数扫描文件的用法

摘要 通过控制和改变所选参数有助于检查给定光学系统的性能。 VirtualLab Fusion提供了完全灵活且计算效率高&#xff08;通过并行化&#xff09;的参数运行&#xff0c;使用户可以指定不同的参数变化方式。 作为示例&#xff0c;它可以用于所研究的任何系统参数的公差分析。 分…

Moonbeam生态说|Moonbeam Ignite重燃DeFi生态活力

日前&#xff0c;Moonbeam Network生态中两家活跃度最高的DeFi协议Moonwell和StellaSwap受邀参加Moonbeam中文社区BinanceLive直播。 作为Moonbeam生态的老朋友&#xff0c;两家项目方的联合创始人对赋能生态胸有成竹。 今年11月&#xff0c;Moonwell和StellaSwap都得到社区投票…

MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 × 51 USING SPARSITY

论文链接: https://arxiv.org/pdf/2207.03620.pdf code: https://github.com/VITA-Group/SLaKlink MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 51 USING SPARSITY一、引言&#xff08;二&#xff09;、大内核注意力&#xff08;二&#xff09;、卷积中的大…

I/O多路转接 —— select、poll、epoll

目录 一、概述 二、I/O多路转接 —— select 1. select函数的基本介绍 2. select的基本工作流程 3. 文件描述符的就绪条件 4. 基于select函数设计的服务器 1. 基本套接字的编写 2. select服务器的编写 5. select的优缺点 三、I/O多路转接 —— poll 1. poll函数的基…

LeetCode-1799- N 次操作后的最大分数和

1、状态压缩动态规划 我们可以使用动态规划来解决问题&#xff0c;我们利用数组dp[s]dp[s]dp[s]来表示状态为s时&#xff0c;能够去到的最大分数。由于题目限定了n的范围&#xff0c;因此我们可以利用二进制数字s来压缩状态&#xff0c;我们利用长度为m的二进制数s的每一位来表…

Javascript | Popper | 如何下载popper.min.js 与 各类js资源

文章目录问题描述解决办法问题描述 作为一个JS生手只知道使用CDN在线引用或者使用下载好的本地JS文件。 比如popper.js官网显示如下图&#xff0c;没有任何的Download按钮&#xff0c;有部分其他类的JS官网也存在同样的情况。 虽然有提供CDN&#xff0c;但因为国内网络原因&am…

Lua table(表)

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型&#xff0c;如&#xff1a;数组、字典等。 Lua table 使用关联型数组&#xff0c;你可以用任意类型的值来作数组的索引&#xff0c;但这个值不能是 nil。 Lua table 是不固定大小的&#xff0c;你可以根据自己需要…

什么是python,为什么要学习Python?

什么是python&#xff1f; 人工智能概念的兴起&#xff0c;使得Python的发展非常迅速&#xff0c;关注度也是越来越高。作为现在最热门的编程语言&#xff0c;Python简单优雅&#xff0c;用尽量少的代码写出最明白的程序&#xff0c;简单易学的特性使其拥有超高的人气&#xf…

VUE—跳转传参

目录 一、基本使用 二、$route和$router 三、路由跳转的两种方式 四、编程式导航 五、传参 六、props 一、基本使用 1、安装vue-router cnpm install --save vue-router3 如果大家用的是vue2&#xff0c;下载vue-router不设置版本好的话&#xff0c;可能会因为版本过高…

大数据Kudu(十一):ClickHouse与Kudu对比

文章目录 ClickHouse与Kudu对比 ClickHouse与Kudu对比 kudu 2015年9月28号出现第一个测试版本0.5.0,2016年2月26第一个正式版0.7.发布。clickhouse 2018年3月开源正式版出现。两者都是列式存储,都可以针对数据进行实时OLAP分析,两者的区别如下: 方面 Kudu