链表基础知识
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/11826481.html
链表用途#
数据需要经常性地插入移除,并且数据量不算很小的情况下,一般都用链表表示
链表插入删除效率极高,达到O(1)。对于不需要搜索但变动频繁且无法预知数量上限的数据,比如内存池、操作系统的进程管理、网络通信协议栈的trunk管理等等等等,缺了它是绝对玩不转的。
在操作系统中,链表用来分配内存,链接了一串空闲内存。分配容易,释放容易。
楼上有人说了LRU和文件系统,还有一个比较常用的应用是git。
git里面每次commit都是创建一个node,node包含了删减后的新文件,然后node指向前一个commit的node。git checkout、delete branch、merge、rebase这些基本上都是以链表操作为主。git应该算是对linked list很好的应用。不用linked list应该很难高效地实现git提供的功能。
相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList,不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。
我觉得在以下场景LinkedList比ArrayList有优势:
1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2) 你的应用更多的插入和删除元素,更少的按索引读取数据(如果只是遍历,区别不大)。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
以上回答摘自知乎:链表(linked list)这一数据结构具体有哪些实际应用?
ArrayList和LinkdList区别#
看了这么多LinkedList的方法,现在我们来总结一下ArrayList和LinkedList的区别(也是顺序表和链表的区别):
(1)ArrayList是基于动态数组实现的,LinkedList是基于双向链表实现的。
(2)ArrayList支持随机访问(通过下标),LinkedList不支持。
(3)ArrayList的查询和尾部插入元素效率较高,中间插入和删除元素效率较低,因为有大量的数组复制操作。
LinkedList的插入和删除效率较高,只需要把节点指针改变一下就行,但是查询效率较低,即使有双向链表的特性可以从两个方向查找,但还是需要使用蛮力法的方式进行遍历,所以效率较低。
(4)ArrayList会造成一定的空间浪费,因为随时需要探测数组容量然后扩容;LinkedList通过节点方式进行存放数据,不存在空间浪费。
转自简书:https://www.jianshu.com/p/6134b16c192c
单向链表#
双向链表#
时间复杂度#
插入 | 删除 | 查找 | 更新 | |
数组 | O(n) | O(n) | O(1) | O(1) |
链表 | O(1) | O(1) | O(n) | O(1) |
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验