浅谈单链表与双链表的区别

浅谈单链表与双链表的区别昨天面试官面试的时候问了我一道关于链表的问题 情境如下面试官 请说一下链表跟数组的区别 我 数组静态分配内存 链表动态分配内存 数组在内存中连续 链表不连续 数组利用下标定位 时间复杂度为 O 1 链表定位元素时间复杂度 O n 数组插入或删除元素的时间复杂度 O n 链表的时间复杂度 O 1 根据以上分析可得出数组和链表的优缺点如下 nbsp 数组的优点随机访问性强 通过下标进行

昨天面试官面试的时候问了我一道关于链表的问题:情境如下

面试官:请说一下链表跟数组的区别?

我:数组静态分配内存,链表动态分配内存;数组在内存中连续,链表不连续;数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。

根据以上分析可得出数组和链表的优缺点如下:

 

数组的优点

  • 随机访问性强(通过下标进行快速定位)
  • 查找速度快

数组的缺点

  • 插入和删除效率低(插入和删除需要移动数据)
  • 可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存)
  • 内存空间要求高,必须有足够的连续内存空间。
  • 数组大小固定,不能动态拓展

链表的优点

  • 插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)
  • 内存利用率高,不会浪费内存(可以使用内存中细小的不连续空间(大于node节点的大小),并且在需要空间的时候才创建空间)
  • 大小没有固定,拓展很灵活。

链表的缺点

  • 不能随机查找,必须从第一个开始遍历,查找效率低

 

面试官:那请说一下单链表和双链表的区别?

 

我:

单链表只有一个指向下一结点的指针,也就是只能next 双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针,可以通过prev()快速找到前一结点,顾名思义,单链表只能单向读取

面试官:从你的描述来看,双链表的在查找、删除的时候可以利用二分法的思想去实现,那么这样效率就会大大提高,但是为什么目前市场应用上单链表的应用要比双链表的应用要广泛的多呢?

我:……这个我真的不知道,然后面试官就提醒我从存储效率上来考虑问题……

我回来后百度了下,发现网上的回答大都是关于链表的代码实现的,并没有关于链表本质深层次的分析,于是我便做以下分析:

单链表与双链表的结构图如下:

浅谈单链表与双链表的区别

浅谈单链表与双链表的区别

从以上结构可以得出双链表具有以下优点:

1、删除单链表中的某个结点时,一定要得到待删除结点的前驱,得到该前驱有两种方法,第一种方法是在定位待删除结点的同时一路保存当前结点的前驱。第二种方法是在定位到待删除结点之后,重新从单链表表头开始来定位前驱。尽管通常会采用方法一。但其实这两种方法的效率是一样的,指针的总的移动操作都会有2*i次。而如果用双向链表,则不需要定位前驱结点。因此指针总的移动操作为i次。

2、查找时也一样,我们可以借用二分法的思路,从head(首节点)向后查找操作和last(尾节点)向前查找操作同步进行,这样双链表的效率可以提高一倍。

可是为什么市场上单链表的使用多余双链表呢?

从存储结构来看,每个双链表的节点要比单链表的节点多一个指针,而长度为n就需要 n*length(这个指针的length在32位系统中是4字节,在64位系统中是8个字节) 的空间,这在一些追求时间效率不高应用下并不适应,因为它占用空间大于单链表所占用的空间;这时设计者就会采用以时间换空间的做法,这时一种工程总体上的衡量。

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213025.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:43
下一篇 2026年3月18日 下午6:44


相关推荐

  • vmware卸载不干净 重装装不上?方法在这里

    vmware卸载不干净 重装装不上?方法在这里vmware 卸载不干净重装装不上 方法在这里用注册表编辑命令 regedit 打开注册表 2 找到目录 HKEY LOCAL MACHINE SOFTWARE VMware Inc3 删除其文件内容和 vMware Inc 目录 在重新安装即可

    2026年3月26日
    1
  • ssm框架过时了吗_mybatis分页插件

    ssm框架过时了吗_mybatis分页插件日志如果一个数据库操作,出现了异常,我们需要排错,日志就是最好的助手曾经:sout,debug现在:日志工厂掌握STDOUT_LOGGINGLOG4Jlog4j什么是Log4j?我们可以控制日志信息输送的目的地是控制台我们也可以控制每一条日志的输出格式通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。分页减少数据量selsect * from user limit startIndex,pageS

    2022年8月8日
    9
  • QueueUserWorkItem_thread.currentthread()

    QueueUserWorkItem_thread.currentthread()usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceTestThreadPool{usingSystem.Threading;classProgram{staticvoidMain(string[

    2026年3月9日
    5
  • Shell脚本获得核酸反向互补序列

    Shell脚本获得核酸反向互补序列DNA 作为生物的遗传物质 由 2 条互补的链按照 A T C G 碱基配对方式形成双螺旋结构 在生物信息处理时 常常需要得到已知序列的反向互补序列 反向是由于学术界约定俗成序列方向为 5 端到 3 端 因此只互补配对得到的是 3 端到 5 端的配对序列 还需要再反向一次变成 5 端到 3 端 诸如 Python 和其他专门的小工具都可以实现 但是这里尝试用 Shell 来解决问题 问题 获得 fasta 格式核酸序列的反向互补配对

    2026年3月19日
    1
  • Merry Christmas & Happy New Year!!

    Merry Christmas & Happy New Year!!

    2022年3月4日
    39
  • 双机热备方案设计

    1什么是双机热备方案  双机热备就是使用互为备份的两台服务器共同执行同一服务,其中一台主机为工作机(PrimaryServer),另一台主机为备份机(StandbyServer),保证系统不间断的运行。双机热备软件就是实现上述功能的软件产品。双机热备针对的是服务器的临时故障所做的一种备份技术,通过双机热备,来避免长时间的服务中断,保证系统长期、可靠的服务。  企事业机构的信息化建设已…

    2022年4月6日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号