【戏玩算法】05-五分钟8张图带你快速了解[链表]

简介: 前面我们讨论了栈和队列这两个数据结构,这篇文章来讨论一下链表这个数据结构。
Hi~,我是 一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~

🫐 写在前面

前面我们讨论了栈和队列这两个数据结构,这篇文章来讨论一下链表这个数据结构。

🍓 什么是链表

链表就是一种线性的数据结构,链表的存储时不连续的,它通过next指针连接在一起,如下图所示:

什么是链表.png

正如上图所示,链表将任意的一组数据进行连接,为了将这些数据进行连接,在每个数据元素中需要存储下一个元素的地址,它有一个官方的名字——后继指针****。

上图中这个链表叫做单链表,还有双向循环链表以及循环链表

🍉 JavaScript中的链表

JavaScript中并没有链表,但是我们可以通过对象模拟链表,示例代码如下:

// 随意定义一些元素
const a = { value: 'a', next: null }
const b = { value: 'b', next: null }
const c = { value: 'c', next: null }
const d = { value: 'd', next: null }

// 实现链表
a.next = b
b.next = c
c.next = d

上面的代码就是要给最简单的链表,画成图是下面这个样子:

js中的链表.drawio.png

🍒 链表的基本操作

现在我们来介绍一下链表的一些基本操作,包括遍历、查找、插入、删除操作。

🍌 遍历链表

遍历列表我们可以定义一个指针,用于记录当前遍历到的元素,在循环中一直将指针后移,即可实现,示例代码如下:

let p = a // p 指向链表的头部
while (p) {
  console.log(p.value)
  p = p.next
}

运行过程如下:

链表遍历过程.gif

🍍 删除链表元素

删除单链表中的元素存在两种情况,第一种就是知道要删除元素的上一个元素,这时候删除就比较简单了,直接将上一个的next指向下一个next,如下图:

删除元素1.png

还有一种情况就是不知道上一个元素是什么,这个时候需要进行两步操作:

  • 将删除元素的下一个元素的值赋值给当前元素
  • 删除下一个元素

如下图所示:

删除元素2.png

现在我们可以利用前面学习的内容,在力扣上做一个算法题,它的题号是83,题目【删除排序链表中的重复元素】,题目描述是给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

83题目描述.drawio.png

上图中就是这个题目需要做的事情。

题目分析:

  • 首先我们需要遍历这个列表,并判断当前与下一个是否相等
  • 如果相等将删除元素
  • 如果不相等将指针指向下一个

实现代码如下:

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
    let p = head
    while (p && p.next) { // 判断p是否为null以及p.next是否存在,p.next不存在说明他是最后一个节点
        if (p.val === p.next.val) {
            p.next = p.next.next
        }else {
            p = p.next
        }
        
    }
    return head
};

运行过程如下图:

力扣83解法.gif

🍑 插入元素

现在我们来学习如何实现在链表插入元素,还是之前那段代码:

// 随意定义一些元素
const [a, b, c, d] = [
  { value: 'a', next: null },
  { value: 'b', next: null },
  { value: 'c', next: null },
  { value: 'd', next: null },
]
const e = { value: 'e', next: null }

// 实现链表
a.next = b
b.next = c
c.next = d

现在我们在bc之间插入元素e,操作步骤如下:

  1. 我们将enext指向c,确保原来的链表不断;
  2. 我们将bnext指向e,就实现了元素的插入

图解如下:

插入元素.png

🍎 写在最后

本篇文章到这就结束了,制图不易,求个赞~

本专栏采用JavaScript作为编程语言,从前端的角度去介绍数据结构与算法,如果对你所有帮助,可以点个关注支持一下啊~
目录
相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
1月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
46 0
|
1月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
44 0
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
32 0
|
1月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
93 0
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
1月前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)
|
1月前
|
算法 索引
经典算法之链表篇
经典算法之链表篇
下一篇
无影云桌面