单向链表结构

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

单链表的逻辑结构如下(带头节点):
image

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

解释:

  1. 链表是以节点的方式来存储,是链式存储;
  2. 每个节点都包含data域和next域:next指向下一个节点;
  3. 链表的各个节点的内存地址不一定是连续存储的;
  4. head节点:不存放具体的数据,作用就是表示单链表的头;

单链表数组的区别是:
单链表的数据元素存放在内存空间的地址是不连续的,而数组的数据元素存放的地址在内存空间中是连续的,这也是为什么根据索引无法像数组那样直接就能查询到数据元素。

单向链表的特点:

  • 每个节点只包含一个指向下一个节点的指针;
  • 只能从头到尾单向遍历;

应用场景:

  • 简单列表应用;
  • 栈的实现;

操作的复杂度分析:

  • 读、写元素
    O(n);
  • 删除元素
    O(1);
  • 增加元素
    O(1);

数组缺点:

  • 数组必须占用整块、连续的内存空间,如果声明数组过大,可能回导致“内存不足”。
  • 数组不够灵活,一旦需要扩容,会重新申请连续整块空间,并需要把原数组的数据全部拷贝到新申请的空间。

链表缺点:

  • 内存空间消耗更大,用于储存结点指针信息。
  • 对链表进行频繁的插入、删除操作会导致频繁的内存申请、释放,容易造成内存碎片,如果是JAVA语言,还有可能会导致频繁的GC(Garbage Collection,垃圾回收)。

双向链表结构

定义:
双链表(Doubly Linked List)也是一种常见的数据结构,与单链表不同的是,双链表每个节点除了包含指向下一个节点的指针(next)外,还包含指向前一个节点的指针(prev)。这使得双链表可以双向遍历,即从头部到尾部或从尾部到头部。

特点:

  • 链表的每个节点都包含一个指向前节点和一个指向后节点的指针,可以双向遍历。
  • 灵活插入:可以在任意节点前后插入新节点

双链表的适合场景:

  • 实现双向队列(deque)
  • 浏览器历史记录(前进/后退功能)
  • 音乐播放器的播放列表
  • 撤销/重做功能实现;

操作的复杂度分析:

  • 读、写元素
    O(n);
  • 删除元素
    O(1);
  • 增加元素
    O(1);
posted on 2024-09-19 13:20  Mysticbinary  阅读(28)  评论(0)    收藏  举报