美文网首页
链表的理解和使用

链表的理解和使用

作者: 文景大大 | 来源:发表于2020-09-10 22:09 被阅读0次

前言

本篇文章主要解决如下几个问题:

  1. 链表和数组相比有哪些不同点?它的优缺点是什么?
  2. 链表有哪些类别?它们各自的优缺点是什么?
  3. 如何使用链表实现LRU算法?

链表相对于数组而言,是两种不同的内存组织方式,链表不需要连续的内存空间,天然支持动态扩容,而且不像数组扩容那样需要搬运数据。链表大小等于实际使用大小,不存在浪费空间的现象。链表适合插入和删除操作,时间复杂度为O(1),但是并不意味着适合非常频繁地插入和删除,因为那样会导致频繁地申请内存和释放内存,容易造成内存碎片,从而提高GC的频率。

一、单链表

每一块内存区域称为一个节点,每个节点有两块区域,数据域保存节点数据,指针域指向下一个节点的地址。其中,头节点是整个链表的基地址,通过它可以遍历整个链表;尾节点的指针值为空,不指向任何地址。

单链表比较适合插入和删除操作,时间复杂度为O(1),注意此处不包含查找到该元素的时间,但是查询操作效率较低,时间复杂度为O(n);

单链表结构示意

二、双向链表

每一块内存区域称为一个节点,每个节点有三块区域,前指针域指向上一个节点的地址,数据域保存节点数据,后指针域指向下一个节点的地址。和单链表相比,存储相同多的数据,双向链表需要的存储空间更多。

双向链表的插入、删除和查询操作都要比单链表的相同操作的效率更高:

  • 插入

    如果需要在第k个节点处插入一个新的节点,那么单链表需要找到前一个节点,时间复杂度为O(n),而双向链表只需要往前遍历一个节点就能找到,时间复杂度为O(1)。

  • 删除

    如果是需要删除给定的元素,那么就只能从第一个节点开始遍历,这种情况两种链表的时间复杂度是一样的;但是如果是给定需要删除元素的指针,那么单链表因为要找到前一个元素p,使得p.next指向待删除元素的下一个节点,所以时间复杂度为O(n),而双向链表则只需要往前遍历一个节点就能找到,时间复杂度为O(1)。

  • 查询

    对于有序链表,每次查找元素k,双向链表可以根据和当前节点的值的大小比较来决定往前遍历还是往后遍历,而单链表只能往后或者从头结点重新开始遍历。

因此,即便双向链表比较占用空间,但这是一种空间换时间的设计思想,使用场景反而比单链表更多。

双向链表结构示意

三、循环链表

循环链表是一种特殊的单链表,区别是其尾节点的指针域不是空,而是指向头节点。其优点就是从链表尾部到链表头部比较方便,当我们需要处理环形结构的数据时,就比较合适。

循环链表结构示意

当然,将双向链表和循环链表组合起来,就能形成一个双向循环量表,这个用的不多,不赘述。

双向循环链表结构示意

四、使用链表实现LRU

常见的缓存淘汰策略有三种,FIFO(先进先出Firt In First Out)、LFU(最少使用Least Frequently Used)、LRU(最近最少使用Least Recently Used)。

  • 对于当前数据,遍历链表,如果在链表中已经存在了,那么删除该节点,并在链表头插入该数据;
  • 如果在链表中不存在,判断当前链表是否小于最大长度,如果没有,直接插入到头部;
  • 如果已经等于最大长度,那么删除尾节点后,再插入到头部;
  • 该算法的时间复杂度为O(n),因为无论如何,都要遍历一次链表;

相关文章

  • 链表的理解和使用

    前言 本篇文章主要解决如下几个问题: 链表和数组相比有哪些不同点?它的优缺点是什么? 链表有哪些类别?它们各自的优...

  • js实现链表(很有意思)

    链表有单向链表、双向链表和循环链表,此篇文章只讲解单向链表,另外两种会在下一篇文章中补充,要真正理解和使用链表的话...

  • 3.链表

    链表 1. 链表和链表节点的实现 每个链表节点使用一个adlist.h/listNode结构来表示 使用adlis...

  • 《数据结构与算法之美》-链表

    数组和链表 数据是使用连续的内存空间存储数据。 链表是使用不连续的内存空间存储数据。 常见链表链表结构 单链表 循...

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

  • 2017.5.25

    lua学习总结:数据结构: 使用Lua实现链表(单向链表和双向链表),队列 使用Lua保存图,用table保存,每...

  • Linux内核设计与实现——内核数据结构

    主要内容 链表 队列 映射 二叉树 1. 链表 单向链表、双向链表 环形链表 linux内核中的链表使用方法和一般...

  • 关于链表与HashMap的一些理解

    一.链表 1.创建链表对象,链表通常包含键Key,值Value和下一个链表对象的引用 2.链表的使用 3.链表的数...

  • LeetCode 707. 设计链表

    707. 设计链表 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 ne...

  • 2.链表

    一、链表和链表节点的实现 每个链表节点使用一个adlist.h/listNode结构表示: 多个listNode可...

网友评论

      本文标题:链表的理解和使用

      本文链接:https://www.haomeiwen.com/subject/rdymektx.html