链表(Linked list)是一种线性表数据结构。一般说链表的时候,会把它与数组放在一块儿进行比较,这样会更好的理解链表。链表克服了数组须要预先知道数据大小的缺点,而且它能够充分利用好内存空间,经过“指针”将一组零散的内存块串联起来使用,实现灵活的内存动态管理。可是链表失去了数组随机访问优势,同时链表因为增长告终点的指针域,空间开销比较大。数组
由于链表的存储空间不是连续的,因此不像数组呢样,每作一次插入删除操做的时候,为了保证内存数据的连续性,都须要作大量的数据迁移,也就意味着它的插入删除操做是十分快速的。一般只须要考虑相邻节点的指针的变化就能够了,因此时间复杂度很低,为O(1)。数据结构
固然有利就有弊。链表的随机访问效率就不如数组了。一样缘由,非连续存储,因此不能经过寻址公式来直接计算内存地址了。只能根据指针去一个节点一个节点的遍历,时间复杂度要搞一些,为O(n)。svg
单链表,双向链表和循环链表。设计
单链表是最简单的一种链表结构了,它包含两个域,一个信息域和一个指针域。而且是单向,结点只有一个后继指针 next 指向后面的结点。指针
双向链表,顾名思义,它支持两个方向,一个前驱指针prev指向前面的节点,一个后继指针next指向后面的节点。同时它也比单链表更加占内存,可是它更灵活,能够双向遍历,因此对插入、删除操做更加简单、高效。cdn
JAVA的LinkedHashMap容器底层就是这个双向链表。blog
循环链表,其实它是一种特殊的单链表。由于单链表的尾结点指针指向空地址,来表示结束。而循环链表的尾结点指针指向它的头结点。换一种角度想,循环链表也能够说是“无头无尾”,它比单链表要稍微省内存一些。ip
定义:是一段地址连续的存储单元依次存储数据元素的线性结构 内存
优势:存取速度高效,经过下标来直接存取 get
缺点:插入和删除比较慢,不能够实时增加长度
适用场景:适用于须要大量访问元素的,而增长/删除元素较少的程序
定义:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称为存储单元为一个节点
优势:插入和删除速度快,保留原有的物理顺序
缺点:查找元素须要遍历,所以不支持随机查找
适用场景:适用于须要频繁进行增长/删除元素,而查找元素较少的程序
在这里能够提一下一种设计思想:空间换时间。众所周知,当空间充足的时候,咱们确定会更加追求代码的执行效率,这个时候能够优先考虑链表。相反,若是内存不充足,好比单片机、手机等等,在这种内存即金钱的时候,则时间换空间,这个时候能够优先考虑数组。
总结: 数组查询效率高效,插入、删除操做效率低效,大小固定。链表查询效率低,插入、删除操做效率高效,没有大小限制。
下一篇则是对于链表具体问题具体分析。
您的点赞和关注是对我最大的支持,谢谢!