一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
前言
我们已经学完了JavaScript数据结构之栈与队列。本期我们就来一起学习一种新的数据结构——链表。首先,我们需要知道了解链表这种数据结构。
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。——百度百科
总结一下:链表存储有序的元素集合,但其内的元素存储在内存中并不是连续放置的(不同于数组)。链表的每个节点存储数据和下一个节点的指针。下图便是一个链表结构。
生活中的链表,想必大家对密室逃脱都很熟悉吧,这便是一个链表,一环套一环,一个线索关联着下一个线索。还有就是火车,一节车厢通过车钩(指针)连接下一节车厢,我们对链表的操作大家可以类比到火车上面帮助理解。表头便是火车头,每节车厢对应链表的每个节点。
OK,说了这么多,我们先来创建一个链表类吧
由于链表是由一个一个节点拼接而成,所以在创建链表之前,我们先创建一个节点的类。
创建节点
class Node {
constructor(data){
this.data = data
this.next = null
}
}
创建链表
class LinkedList {
constructor(){
// 链表大小
this.count = 0
// 头节点
this.head = null
// 比较函数
this.isEqual = function(a,b){
return a === b
}
}
}
创建完链表,让我们梳理一下链表都有哪些方法。
- push(data) 向链表尾部添加一个新元素
- pushAnyWhere(data,position) 向链表的特定位置添加一个新元素
- getData(index) 返回链表特定位置的元素。不存在返回undefined
- remove(data) 从链表中移除一个元素
- indexOf(data) 返回数据在链表中的索引,不存在返回-1
- removeAnyWhere(position) 从链表特定位置移除一个元素
- isNull() 链表是否为空
- size() 链表中的元素个数
总结
本期我们接触新的数据结构——链表。并创建了一个链表类(空壳)。下期我们一起实现链表中包含的方法。