目录

链表

定义

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

详解

  • 链表的存在就是为了解决数组的增删复杂耗时,内存占用较大的问题。它并不需要一块连续的内存空间,它通过指针将一组零散的内存块串联起来。
  • 根据指针的不同,有单链表,双向链表,循环链表之分。
  • 数组和链表是相互补充的一对数据结构。

优点:

  • 操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。
  • 链表因为元素不连续,而是靠指针指向下一个元素的位置,本身没有大小的限制,不存在数组的扩容问题,所以天然地支持动态扩容。
  • 空间没有限制
  • 插入删除元素很快

缺点:

  • 因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问。
  • 由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。
  • 同时内存不连续,容易造成内存碎片。
  • 存取速度很慢

对比

数组

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难。

链表

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

哈希表

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?这就是我们要提起的哈希表。

分类

  • 单向链表 一个节点指向下一个节点。
  • 双向链表 一个节点有两个指针域。
  • 循环链表 能通过任何一个节点找到其他所有的节点,将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环。