数据结构2:顺序表和链表

这篇具有很好参考价值的文章主要介绍了数据结构2:顺序表和链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.线性表

2.顺序表

2.1概念及结构

2.2接口实现

2.3数据相关面试题

2.4顺序表的问题及思考

3.链表

3.1链表的概念及结构

3.2链表的分类

3.3链表的实现

3.4链表面试题

3.5双向链表的实现

4.顺序表和链表的区别


1.线性表

线性表(linear list)是具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛应用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式的形式存储。

数据结构2:顺序表和链表

2.顺序表

2.1概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。数据结构2:顺序表和链表
  2. 动态顺序表:使用动态开辟的数组存储。数据结构2:顺序表和链表

2.2接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表。根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{
    SLDataType* array; // 指向动态开辟的数组
    size_t size ; // 有效数据个数
    size_t capicity ; // 容量空间的大小
}SeqList;
// 基本增删查改接口

// 顺序表初始化
void SeqListInit(SeqList* psl, size_t capacity);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);

2.3数据相关面试题

  1. 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1).答案
  2. 删除排序数组中的重复项。
  3. 合并两个有序数组。

2.4顺序表的问题及思考

问题:

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么久浪费了95个数据空间。

思考:如何解决上面的问题呢?

3.链表

3.1链表的概念及结构

概念:链表是一种物理存储架构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

数据结构2:顺序表和链表

 现实中数据结构中

数据结构2:顺序表和链表

注意:

  1. 链式结构在逻辑上是连续的,但是在物理上不一定连续
  2. 现实中的节点一般是从堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次的申请的的空间可能连续,也可能不连续。 

假设在32位系统上,节点中值域为int类型,则一个节点的大小为8个字节,则也可能有下述链表:

数据结构2:顺序表和链表  

3.2链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

数据结构2:顺序表和链表

  1. 单项或者双向数据结构2:顺序表和链表
  2. 带头或者不带头数据结构2:顺序表和链表
  3. 循环或者非循环数据结构2:顺序表和链表

虽然有这么多的链表的结构,但是我们实际中最常用的还是两种结构:数据结构2:顺序表和链表

  1. 无头单项非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等,另外这种结构在笔试面试中出现很多。
  2. 带头双向循环链表:结构最复杂,一般用来单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。虽然结构复杂,但是使用代码实现以后会发现结构会带来更多优势实现反而简单了。

3.3链表的实现

 单链表的实现(无头+单向+非循环链表增删查改实现)

3.4链表面试题

  1. 删除链表中等于给定值 val 的所有节点。 答案
  2. 反转一个单链表。 答案
  3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。答案
  4. 输入一个链表,输出该链表中倒数第k个结点。答案
  5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。答案
  6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。答案
  7. 链表的回文结构。答案
  8. 输入两个链表,找出它们的第一个公共结点。答案
  9. 给定一个链表,判断链表中是否有环。 答案

    【思路】

    快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表的起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。

    【扩展问题】

    1. 为什么快指针每次走两步,慢指针走一步可以?

    假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在慢指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。

    数据结构2:顺序表和链表

    2. 快指针一次走3步、走4步、走n步可以吗?

    假设:快指针每次走3步,慢指针每次走一步,快指针肯定先进环,慢指针后进环。假设慢指针进环的时候,快指针的位置如图所示:数据结构2:顺序表和链表

    此时按照上述方法来绕环移动,每次快指针走3步,慢指针走1步,是永远不会相遇的,快指针刚好将慢指针套圈了,因此不行。

    只有快指针走2步,慢指针走1步才可以,因为换的最小长度是1,即使套圈了两个也在相同的位置。 

  10. 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL 。答案

    结论:

    让一个指针从链表的起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。数据结构2:顺序表和链表

  11. 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝。答案

3.5双向链表的实现

双向链表的实现(带头+双向+循环链表增删查改实现)

4.顺序表和链表的区别

不同点 顺序表 链表
存储空间 物理上一定连续 逻辑上连续,但是物理上不一定连续
随机访问 支持O(1) 不支持O(N)
任意位置插入或删除元素 可能需要搬移元素,效率低O(N) 只需修改指针指向
插入 动态顺序表,空间不够时需要扩容。 没有容量的概念
应用场景 元素高效存储+频繁访问 任意位置插入或删除频繁
缓存利用率

数据结构2:顺序表和链表

缓存利用率:

当SRAM拜访DRAM时,会默认加载一段数据(假设32byte - 与硬件有关)而不是一个数据(假设4byte),文章来源地址https://www.toymoban.com/news/detail-416009.html

  • 加载顺序表,就会直接加载到有效数据(物理内存是连续的),接下来直接访问之后的有效数据。
  • 加载链表,加载到一个有效数据,其后面跟随的数据不一定是有效数据(链表的的存储在物理内存上是不连续的),此时就带来的缓存污染(将非有效数据读取进SRAM)。

到了这里,关于数据结构2:顺序表和链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手撕数据结构】(三)顺序表和链表

    🎗️线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 🎗️线性表在逻辑上是线性结构,也就说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储

    2024年02月05日
    浏览(31)
  • 【数据结构初阶】顺序表和链表(1)

    线性表(linear list) 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上

    2024年02月08日
    浏览(34)
  • 数据结构修炼第二篇:顺序表和链表

    第一章 时间复杂度和空间复杂度 第二章 顺序表,列表 第三章 栈和队列 第四章 二叉树 第五章 排序 作者:🎈乐言🎈 简介:🎈大一学生,目前在致力于c/c++/python,高数的学习,有问题尽管问我,关注后私聊! 持续更新专栏:《c进阶》,《数据结构修炼》 🚀 (优质好文持

    2024年02月02日
    浏览(36)
  • 【数据结构篇C++实现】- 线性表 - 顺序表和链表

    友情链接:C/C++系列系统学习目录 故事导入: 幼儿园放学时,一个班级的小朋友,一个跟着一个排队出校,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面和后面的一个是谁,就如同一根线把他们串联了起来。如此具有像线一样的性质的表就叫线性表 线性表(

    2024年02月07日
    浏览(39)
  • 初阶数据结构之---顺序表和链表(C语言)

    线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上存储时,通常以 数组 和 链式结构 的形式存储。

    2024年02月22日
    浏览(42)
  • <数据结构>顺序表和链表的比较|缓存命中率

    💭前言:通过之前对顺序表和链表的实现,我们可以发现在增删查改某些操作上两者的效率前言有所差异,本篇文章将总结二者的异同。 顺序表的实现 http://t.csdn.cn/Lxyg2 单链表的实现 http://t.csdn.cn/rHgjG 双链表的实现 http://t.csdn.cn/j3amO 📚顺序表通过数组来实现的,所以在物理

    2024年02月05日
    浏览(29)
  • 数据结构(王道)——线性表之静态链表&顺序表和链表的比较

      如何定义一个静态链表     初始化静态链表:   静态链表的查找、插入、删除           创: 销:   增、删:   查:   顺序表、链表该如何选择?  

    2024年02月16日
    浏览(33)
  • 顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组  3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义  2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双向链表 双向链

    2024年01月24日
    浏览(33)
  • 探索树形数据结构,通识树、森林与二叉树的基础知识(专有名词),进一步利用顺序表和链表表示、遍历和线索树形结构

      结点之间有分支,具有层次关系 树的定义 : 树 (tree)是n(n≥0)个有限集。 若n = 0,则称为空树; 若n 0,则它满足如下两个条件: 有且仅有一个特定的称为根(Root)的结点; 其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3,.....,Tm,其中每一个集合本身又是一棵树,并称为根的

    2024年02月01日
    浏览(33)
  • 顺序表和链表

    首先,数据结构中的顺序表和链表都属于线性表。何为线性表?线性表可以描述为: 具有相同数据类型的n个数据元素的有限序列。 形象理解线性表的要素: 幼儿园小朋友放学,需要在校内站成一队,等待家长来接。这是一个 有限 的序列。 总共有几个小朋友,称之为线性表

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包