由于链表无需按顺序存储,因此链表在插入的时可以达到 O(1) 的复杂度,比顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表插入和查询的时间复杂度分别是 O(log n) 和 O(1)。

  • 单向链表
  • 双向链表
  • 循环链表
    • 单循链表
    • 双循环链表

链表 - 图1

单向链表

链表中最简单的一种是单向链表,或叫单链表,它包含两个域,一个数据域和一个指针域,指针域用于指向下一个节点,而最后一个节点则指向一个空值,如下图所示:
链表 - 图2
单链表的遍历方向单一,只能从链头一直遍历到链尾。它的缺点是当要查询某一个节点的前一个节点时,只能再次从头进行遍历查询,因此效率比较低,而双向链表的出现恰好解决了这个问题。

  1. private static class Node<E> {
  2. E item
  3. Node<E> next
  4. Node(E element, Node<E> next){
  5. this.item = element
  6. this.next = next
  7. }
  8. }

双向链表

双向链表也叫双面链表,它的每个节点由三部分组成:prev 指针指向前置节点,此节点的数据和 next 指针指向后置节点,如下图所示:
链表 - 图3

  1. private static class Node<e> {
  2. E itme
  3. Node<E> prev
  4. Node<E> next
  5. Node(Node<E> prev, E element, Node<E> next){
  6. this.item = element
  7. this.prev = prev
  8. this.next = next
  9. }
  10. }

循环链表

循环链表又分为单循环链表和双循环链表,也就是将单向链表或双向链表的首尾节点进行连接,这样就实现了单循环链表或双循环链表了,如下图所示:
链表 - 图4
链表 - 图5

JavaScript下单链表的数据结构

  1. function List() {
  2. // 节点
  3. let Node = function(element) {
  4. this.element = element
  5. this.next = null
  6. }
  7. // 初始化节点为null
  8. let head = null
  9. // 链表长度
  10. let length = 0
  11. // 操作
  12. this.getList = function() {return head}
  13. this.search = function(list, element){}
  14. this.append = function(element){}
  15. this.insert = function(position, element){}
  16. this.remove = function(element){}
  17. this.isEmpty = function(){}
  18. this.size = function(){}
  19. }