- 本文参加了由大众号@若川视野发起的每周源码共读活动, 点击了解概况一起参与。
- 这是源码共读的第32期,链接yocto-queue 行列 链表
前语
hi,我是麦谷。今日恰好周六,我又来学习源码了:行列链表。从之前读过的一本书-学习JavaScript数据结构与算法(第3版)里得知,行列遵从的原则是先进先出(FIFO,也称为先来先服务),具体内容不细说,想要学习JavaScript算法的同伴能够看看这本书。相信大多数同伴关于链表这种数据结构并不陌生吧?链表在算法中具有非常重要的地位,比方面试进程中经常被问到原型链……
行列链表
在我学习源码的进程中往往是带着自己的疑问去学习的,当自己的疑问处理完了,就大约了解源码的内容了。
什么是行列链表?
行列链表和行列有什么关系?
先贴上源码:
/*
How it works:
`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.
*/
// 每个节点
class Node {
value;
next;
constructor(value) {
this.value = value;
}
}
export default class Queue {
#head;// 头指针
#tail;// 最后一个元素
#size;// 链表的长度
constructor() {
// 初始化节点
this.clear();
}
enqueue(value) {
// 构建一个新的节点
const node = new Node(value);
// 假如头部指针存在,也便是向已有节点的指针插入数据
if (this.#head) {
this.#tail.next = node;
this.#tail = node;
} else {
// 向空链表插入数据
this.#head = node;
this.#tail = node;
}
// 每次向链表插入数据都会增加链表的长度
this.#size++;
}
// 这是从行列链表中取出一个元素的办法
dequeue() {
const current = this.#head;
if (!current) {
return;
}
this.#head = this.#head.next;
this.#size--;
return current.value;
}
clear() {
this.#head = undefined;
this.#tail = undefined;
this.#size = 0;
}
// 自定义获取行列链表的长度
get size() {
return this.#size;
}
// 自定义链表迭代器,这样就能够知道链表里的内容了
* [Symbol.iterator]() {
let current = this.#head;
while (current) {
yield current.value;
current = current.next;
}
}
}
从源码的内容来看,似乎应用了新的常识,简而言之,便是在类里边新增了一个符号来声明私有特点。
总结
什么是行列链表?
行列链表是能够拆开来看的,行列和链表,即遵从元素先进先出(FIFO)且元素节点是节点的数据结构。
行列链表和行列有什么关系?
链表上的节点能够存储多个特点,行列链表的每个元素都是一个链表节点。