Java数据结构:链表
2. 链表(LinkedList)
2.1 简介
-
链表是一种线性表,但不按线性顺序存储,存储数据的内存空间不连续
-
执行复杂度:
- 插入和删除:O(1),仅需要知道目标元素的上一个元素
- 查找和访问特定节点:O(n)
-
与数组相比:
- ****非随机访问:存取第N个数据时需要访问前(N-1)个数据
- 容量不固定,支持动态扩容。不需要预先知道数据大小,充分利用存储空间,实现内存动态管理
- 占用更多空间:链表中每个结点需要额外存放指向其他节点的指针
- 数组使用的是连续内存空间对 CPU 的缓存机制友好,链表则相反。
-
应用场景
- 存储元素个数不确定,需要经常添加和删除数据;反之使用该数组
- 不需要支持随机访问
2.2 分类
常见链表有:
- 单链表
- 双向链表
- 循环链表
- 双向循环链表
2.2.1 单链表
- 单链表只有一个方向,结点只有一个后继指针next指向后面的结点。
- 链表有一个头结点(head),头结点一般不存储信息,指针指向第一个元素结点的存储位置
- 尾结点通常指向null
2.2.2 循环链表
循环链表是一种特殊的单链表,它的尾结点指向链表的头结点
2.2.3 双向链表
双向链表包含两个指针,一个prev指向前一个结点,一个next指向后一个结点
2.2.4 双向循环链表
双向循环链表的:
- 尾结点的next指向头结点
- 头结点的prev指向尾结点