链表的概念

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

  链表的结构是多式多样的,当时通常用的也就是两种:


  

无头单向非循环列表:结构简单,一般不会单独用来存放数据。实际中更多是作为其他数据结构的子结构,比如说哈希桶等等。
  带头双向循环链表:结构最复杂,一般单独存储数据。实际中经常使用的链表数据结构,都是带头双向循环链表。这个结构虽然复杂,但是使用代码实现后会发现这个结构会带来很多优势,实现反而简单了。

链表和数组的区别:

数组静态分配内存,链表动态分配内存。
数组在内存中是连续的,链表是不连续的。
数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。
数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。

数组的优点

随机访问性比较强,可以通过下标进行快速定位。
查找速度快

数组的缺点

插入和删除的效率低,需要移动其他元素。
会造成内存的浪费,因为内存是连续的,所以在申请数组的时候就必须规定七内存的大小,如果不合适,就会造成内存的浪费。
内存空间要求高,创建一个数组,必须要有足够的连续内存空间。
数组的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展。

链表的优点

插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。
内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。

链表的缺点

查找的效率低,因为链表是从第一个节点向后遍历查找。

单链表和双链表的区别:


单链表的每一个节点中只有指向下一个结点的指针,不能进行回溯,适用于节点的增加和删除。
双链表的每一个节点给中既有指向下一个结点的指针,也有指向上一个结点的指针,可以快速的找到当前节点的前一个节点,适用于需要双向查找节点值的情况。

双链表相对于单链表的优点:

  删除单链表中的某个节点时,一定要得到待删除节点的前驱,得到其前驱的方法一般是在定位待删除节点的时候一路保存当前节点的前驱,这样指针的总的的移动操作为2n次,如果是用双链表,就不需要去定位前驱,所以指针的总的的移动操作为n次。
  查找时也是一样的,可以用二分法的思路,从头节点向后和尾节点向前同时进行,这样效率也可以提高一倍,但是为什么市场上对于单链表的使用要超过双链表呢?从存储结构来看,每一个双链表的节点都比单链表的节点多一个指针,如果长度是n,就需要n*lenght(32位是4字节,64位是8字节)的空间,这在一些追求时间效率不高的应用下就不适用了,因为他占的空间大于单链表的1/3,所以设计者就会一时间换空间。

链表环问题

判断是否有环

  定义一个快指针和一个慢指针,快指针一次走两步,慢指针一次走两步,会出现两种情况,情况一指针走到了空的位置,那就说明这个链表不带环。情况二两个指针相遇,说明这个链表带环。

获得入环节点

  如果不考虑空间复杂度,可以使用一个map来记录走过的节点,这个指针一直向后遍历如果遇到空,说明这个链表不带环,也就没有入环节点,如果没有遇到空,如果遇到第一个在map中存在的节点,就说明回到了出发点,这个节点就是环的入口节点。如果不建立额外的空间,先使用快慢指针判断这个链表是否有环,如果有环将相遇节点记录,然后一个指针从链表的起始位置开始一次走一步,另一个指针从记录的节点开始一次走一步,当两个节点再次相遇,这个相遇节点就是环的入口节点。

关注公众号,获取最新信息

链表及链表与数组的区别优缺点相关推荐

  1. java数组和链表的区别_java中链表和数组的区别?

    综述:数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的 ...

  2. 数据结构 - 链表和数组的区别

    文章目录 数据结构 - 链表和数组的区别 1.在内存上 2.时间复杂度 3.链表的结构 4.各自的优缺点 5.为什么使用较常用的是单头链表 数据结构 - 链表和数组的区别 1.在内存上 数组是连续内存 ...

  3. php数组和链表的区别,什么是链表?链表与数组的区别?

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

  4. 链表与数组的区别以及链表相关的操作

    1.链表与数组的区别 2.链表的创建以及链表的静态添加 3.链表的动态添加(头插法) 1.链表与数组的区别: 谈到链表与数组的区别,可以从几个不同的角度来谈, 首先从逻辑结构上说,两者都是数据结构的一 ...

  5. 栈,队列和链表三者之间的关系与区别

    最近一直在学习算法,刷算法题,但是自从大学毕业以来,数据结构的知识都还给老师了,只会个数组,所以前期刷的题目也都是有关数组的 最近跟着小册重学了一遍数据结构,今天就记录一下栈,队列和链表三者之间的关系 ...

  6. 链表,队列,堆栈的区别

    链表,队列,堆栈的区别 1.栈是个有底的口袋,像袜子. 队列是没底的口袋,像通心粉. 所以:栈的特点是先进后出,队列的特点是先进先出. 2.主要区别是适用的地方不一样,      链表实际上可以认为是 ...

  7. 链表,队列和栈的区别

    链表,队列和栈都是数据结构的一种.Sartaj Sahni 在他的<数据结构.算法与应用>一书中称:"数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系 ...

  8. 基础数据结构【二】————动态数组,单向链表及链表的反转

    DEMO1:     动态分配变量(链表,而静态数组是线性表,意味着动态数组访问和遍历复杂度为O(n),而插入和删除复杂度为O(1),而静态数组线性表则完全相反) int* intptr = new ...

  9. 链表和顺序表的一些区别

    顺序表与链表是非常基本的数据结构,它们可以被统称为线性表. 线性表(Linear List)是由 n(n≥0)个数据元素(结点)a[0],a[1],a[2]-,a[n-1] 组成的有限序列. 顺序表和 ...

最新文章

  1. MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案
  2. composer update报错: The https://packagist.phpcomposer.com/p/xxx file could not be downloaded
  3. pytorch:ResNet50做新冠肺炎CT照片是否确诊分类
  4. aspose java_Aspose.Cells for Java
  5. 【python数据挖掘课程】十四.Scipy调用curve_fit实现曲线拟合
  6. Loading 遮蔽层 简单实现。
  7. linux 编译system.img,android生成sysytem.img的命令过程
  8. 经商失败的人,最可怕的不是失去金钱,而是失去信心
  9. mysql ssl编译_centos编译安装配置支持ssl加密的mysql replication
  10. [转]java代码混淆以及及IDEA中springboot使用Allatori进行混淆
  11. Docker-基本命令和漏洞分享
  12. kaggle电影数据分析报告
  13. 论文阅读:Gibberish, Assistant, or Master? Using Tweets Linking to News for Extractive Single-Document Su
  14. 量子计算 19 量子算法4 (Shor Part I)
  15. unity实现鼠标打飞碟(Hit UFO)游戏
  16. dw的html代码文档,Dw 基础篇:DW的文档工具栏
  17. ctf 点击1000000次
  18. 【x86架构】SMM
  19. MFC中的CDC 绘图
  20. item_review - 获得商品评论(shopee虾皮)

热门文章

  1. postgral中转义特殊符号
  2. 数学归纳法证明Nicomachus's Theorem
  3. 金九银十准备季:Java IO流面试题(含答案)
  4. linux sslocal 客户端报错
  5. winform遍历bartender_C#怎么调用bartender软件
  6. uploadify上传文件出现http302错误
  7. 经济学本质上就是心里学
  8. Unity Protobuf 简单 案例 详解 从下载到安装和使用
  9. [Zookeeper-3.6.2源码解析系列]-13- 法定人对象QuorumPeer启动之加载磁盘快照与事务日志
  10. 鲜花朵数代表的含义,你懂了吗?