单向链表结构
定义:
单链表是一种链式存取的数据结构,单链表中的数据是以结点的形式存在,每一个结点是由数据元素和下一个结点的存储的位置组成。
单链表的逻辑结构如下(带头节点):

链表在内存中的存储结构如下:

解释:
- 链表是以节点的方式来存储,是链式存储;
- 每个节点都包含data域和next域:next指向下一个节点;
- 链表的各个节点的内存地址不一定是连续存储的;
- head节点:不存放具体的数据,作用就是表示单链表的头;
单链表与数组的区别是:
单链表的数据元素存放在内存空间的地址是不连续的,而数组的数据元素存放的地址在内存空间中是连续的,这也是为什么根据索引无法像数组那样直接就能查询到数据元素。
单向链表的特点:
- 每个节点只包含一个指向下一个节点的指针;
- 只能从头到尾单向遍历;
应用场景:
- 简单列表应用;
- 栈的实现;
操作的复杂度分析:
- 读、写元素
O(n); - 删除元素
O(1); - 增加元素
O(1);
数组缺点:
- 数组必须占用整块、连续的内存空间,如果声明数组过大,可能回导致“内存不足”。
- 数组不够灵活,一旦需要扩容,会重新申请连续整块空间,并需要把原数组的数据全部拷贝到新申请的空间。
链表缺点:
- 内存空间消耗更大,用于储存结点指针信息。
- 对链表进行频繁的插入、删除操作会导致频繁的内存申请、释放,容易造成内存碎片,如果是JAVA语言,还有可能会导致频繁的GC(Garbage Collection,垃圾回收)。
双向链表结构
定义:
双链表(Doubly Linked List)也是一种常见的数据结构,与单链表不同的是,双链表每个节点除了包含指向下一个节点的指针(next)外,还包含指向前一个节点的指针(prev)。这使得双链表可以双向遍历,即从头部到尾部或从尾部到头部。
特点:
- 链表的每个节点都包含一个指向前节点和一个指向后节点的指针,可以双向遍历。
- 灵活插入:可以在任意节点前后插入新节点
双链表的适合场景:
- 实现双向队列(deque)
- 浏览器历史记录(前进/后退功能)
- 音乐播放器的播放列表
- 撤销/重做功能实现;
操作的复杂度分析:
- 读、写元素
O(n); - 删除元素
O(1); - 增加元素
O(1);
浙公网安备 33010602011771号