持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
关于算法系列已更新部分文章,后续会陆续增加内容:
【1】 算法之用动态规划实现斐波那契数列
【2】 算法之双指针法的应用
【3】 算法之链表的含义
初识链表是在学习数据结构的时候, 实现的是 c 语言或是 c++ 版本,虽然没有接触过前端的写法,但含义都是相同的,只是遵循不同的语法规则。
链表和数组
链表和数组都是计算机中用来存储和操作数据的一种结构,操作数据也就是增删改查等。
-
对于数组来说,它的内存地址是连续的,查找元素相对较快,时间复杂度为O(1);但当需要改变数组结构(比如删除和插入元素)的时候,会涉及到元素的批量移动,时间复杂度为O(n),相对较高。
-
对于链表来说,它的内存地址并不是连续的,而是通过前一个结点存储下一个结点的地址进行连接,所以相较数组来说链表在查找元素方面并不具备明显优势(时间复杂度为O(n));但当进行增删改的时候,时间复杂度为O(1),相对较低。
结构
一个链表是由0到多个结点连接而成的,以单链表为例,每一个结点包含两部分:data 和 next。
- data:数据域,存储数据
- next:指针域,存储地址
分类
-
单链表
上图就是一个单链表的形式
-
双链表
双链表会比单链表多一个 pre 域,并且是双向连接
- 循环链表
- 双向循环链表
定义结点
下面是使用 Javascript 实现的版本,使用 class 定义基础结构,这里的 val 就是上面提到的数据 data 域。
class ListNode {
val;
next = null;
constructor(value) {
this.val = value;
this.next = null;
}
}
应用
- 设计链表
- 移除链表元素
- 翻转链表
- 交换链表
- ......