IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 神奇的线性表(链表) -> 正文阅读

[数据结构与算法]神奇的线性表(链表)

目录

神马是链表

链表的分类

单向链表

?链表的常用操作

查找操作

插入操作?

?删除操作

?链表与数组

数组的插入

数组的删除?

链表的应用

?尾声


神马是链表

记得很久很久以前…我们学习过数组, 数组是在内存中一段连续的存储空间, 可以在常数时间内访问任意位置的元素, 但是数组也有缺点, 无法做到快速的插入和删除, 因为空间是连续且固定的, 想要在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,则是头节点。

?尾声

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:33:24  更:2022-12-25 11:36:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 20:15:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计