半小时带你拿下链表(前端)

1,470 阅读5分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、链表简介

  • 多个元素组成的列表
  • 元素存储不连续,是用过next指针联系在一起的

image.png

看到这,大家肯定会有疑问,既然都是列表,那它和数组有什么不同呢?我们不放这样想,当我们想要增删数组的非首尾元素,我们需要改变数组的下标,这样操作会很麻烦,复杂度高。但是我们增删链表的非首尾元素时,只需要改变next的指向即可,这是不是很方便呢!

在前端中,也可以说在JS中,是没有链表这种数据结构的,但是我们可以通过Object来模拟链表。

代码如下

image.png

  • 下面我们尝试遍历链表

我们声明一个指针 通过指针的移动,获取每个节点的值,直到节点指向null,说明到了最后一个

image.png

  • 增加一个节点,我们在bc之间增加一个e

image.png

-删除e节点

image.png

二、 leetcode 237-删除链表中的节点

image.png

这道题第一次做肯定会有很多同学认为很简单,认为直接把要删除节点的上一个节点指向下一个节点就可以了,如果你这样想,那就说明你没有真正的了解链表,因为我们并不能直接获取上一个节点。所以这么想是行不通的。

但是我们可以这样,我们是可以获取我们的下一个节点的值。我们可以把下一个节点的值给要删除的节点,之后删除下一个节点就可以了,如图

image.png 把要删除的节点的下一个节点值给当前节点 就变为如下

image.png 之后删除下一个节点,就得到了答案

image.png

代码如下

image.png

上述代码的时间空间复杂度都是O(1)

三、leetcode 206-反转链表

image.png

这道题我们可以先从两个节点去想,如果我们只有两个节点,那么我们直接把第二个节点指向第一个就可以,顺着这种思路,我们可以用两个指针来进行换位这种操作。

image.png

代码如下

image.png 这个算法的时间复杂度是O(N),空间复杂度是O(1)

这道题主要就是双指针的应用,很多问题,我们都可以按照这种思路去解决。

四、leetcode 2-两数相加

image.png

image.png 这道题我们可以看出,将对应位置的两个节点值相加,如果相加大于10,就把十位数字加到下一个节点的计算中。首先,我们声明一个新的链表,存储最后的结果

image.png

之后遍历两个链表,把对应位置的相加放入新的链表中,当两个链表的长度不等时,没有节点的时候默认值为0。超过10,把十位数加到下一个节点的计算中

image.png

之后移动节点

image.png

上述的代码,其实我们漏掉了一步,如果最后一次时c的值是大于0的,那我们却没把这个值添加到新的链表中,如下就是错误的,原因就是我们忘了处理c

image.png

修改后的代码如下:

image.png

是看复杂度是O(N),空间复杂度也是O(N)

五、leecode 83-删除排序链表中的重复元素

image.png

这道题我们要注意的是是排序链表,这句话会让问题变得更加简单,这说明重复的元素是相邻的,所以我们只需要比较当前元素是否和下一个元元素的相等,如果相等就删除下一个元素,不相等,就移动指针继续比较。

image.png

六、leetcode 141-环形链表

这道题判断就是判断有没有环,我们可以类比生活中的例子,比如我们近期常看的f1比赛,在环形跑道上,有的技术好的总是能落下慢的一圈,当;落下一圈时,两个车手肯定会在某一点上重逢,再次相遇。我们可以把这个思想放在这道题目中,我们可以声明两个指针,一快一慢,如果是环形,那总会相遇。具体代码如下:

image.png

七、JS中的原型链

很多人可能很疑惑,不是在说链表么,怎么说上原型链了?

其实JS中的原型链本质上就是链表,它是通过_proto_来连接的链表。

那么原型链长啥样呢,我们可以通过对象、函数、数组来看一下。

image.png

通过上述结果我们发现,出了对象之外,数组和函数都是先指向自身的原型对象再指向对象的原型,这一点对于String和Number也是成立的

7.1 原型链相关知识点

如果A沿着原型链能找到B.prototype,那么A instanceof B 为true

这个知识点其实就是我们上边图片上的例子。

如果在A上没有找到y属性,那么就会沿着原型链寻找y属性,直至找到或者找到null为止

7.2 instanceof原理

你肯定遇到过这样一到面试题,请简述instanceof的原理并实现instanceof

其实instanceof的原理就是:如果A沿着原型链能找到B.prototype,那么A instanceof B 为true

代码如下:

image.png

八、使用链表获取Json的节点值

这个其实就是链表在前端内的一个应用场景,在我们做一些复杂系统时,我们可能需要做类似的操作,在这里我们通过一个小例子来写一段代码

image.png