链表
存储多个元素,数组是最常见的数据结构,几乎每种语言都实现了数组,这很方便。但是它有一个很严重的缺点,插入和删除的成本都非常高,可能需要移动大量的元素
链表也是一种存储有序元素的结构,但和数组不同的是,元素在内存中地址不一定是连续的,每个元素由一个数据项和指向下一个元素的引用组成,相对于传统的数组容量是无限的,在进行插入和删除元素的时候不需要移动其他元素。缺点也很明显,不能像数组那样随机访问,访问某一个元素,必须从表头开始遍历
相对顺序存储来说,链式存储的存储空间地址是可以连续的,也可以是不连续的,地址并不对应逻辑关系,链式存储有以下优势:
- 大小是无限的,不会产生额外的空间浪费
- 插入和删除元素的复杂度为 O(1)
劣势:
- 访问元素的复杂度为 O(n),必须从第一个元素按顺序访问元素
- 存储密度低,需要额外的空间表示存储关系
- 对缓存不是很友好
链表由指向第一个节点的指针表示,第一个节点称为头部,如果链表为空,则头部的值为NULL
每个节点至少由两部分组成:
- 数据
- 指向下一个节点的引用
ADT:
- 插入
- 删除元素
- 删除链表
- 计数
- 查找
双向链表
在链表中,一个节点只有链向下一个节点的链接。而在双向链表中,链接是双向的,一个节点链向下一个元素,另一个节点链向前一个元素,可以很方便的访问回到上一个节点
循环链表
循环链表和普通链表的唯一区别就是最后一个元素的指针总是指向第一个元素,它可以是单向或双向的
有序链表
有序链表中的元素是按照一定的顺序进行排列的
静态链表
静态链表兼顾了顺序表和链表的优点,在插入和删除是不需要移动元素,同时可以进行随机访问