算法之链表的含义

169 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

关于算法系列已更新部分文章,后续会陆续增加内容:

【1】 算法之用动态规划实现斐波那契数列

【2】 算法之双指针法的应用

【3】 算法之链表的含义

初识链表是在学习数据结构的时候, 实现的是 c 语言或是 c++ 版本,虽然没有接触过前端的写法,但含义都是相同的,只是遵循不同的语法规则。

链表和数组

链表和数组都是计算机中用来存储和操作数据的一种结构,操作数据也就是增删改查等。

  • 对于数组来说,它的内存地址是连续的,查找元素相对较快,时间复杂度为O(1);但当需要改变数组结构(比如删除和插入元素)的时候,会涉及到元素的批量移动,时间复杂度为O(n),相对较高。

  • 对于链表来说,它的内存地址并不是连续的,而是通过前一个结点存储下一个结点的地址进行连接,所以相较数组来说链表在查找元素方面并不具备明显优势(时间复杂度为O(n));但当进行增删改的时候,时间复杂度为O(1),相对较低。

结构

一个链表是由0到多个结点连接而成的,以单链表为例,每一个结点包含两部分:data 和 next。

  • data:数据域,存储数据
  • next:指针域,存储地址 image.png

分类

  1. 单链表

    上图就是一个单链表的形式

  2. 双链表

    双链表会比单链表多一个 pre 域,并且是双向连接

image.png

  1. 循环链表

image.png

  1. 双向循环链表

image.png

定义结点

下面是使用 Javascript 实现的版本,使用 class 定义基础结构,这里的 val 就是上面提到的数据 data 域。

class ListNode {
  val;
  next = null;
  constructor(value) {
    this.val = value;
    this.next = null;
  }
}

应用

  • 设计链表
  • 移除链表元素
  • 翻转链表
  • 交换链表
  • ......