JavaScript数据结构——链表(1)

108 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

前言

我们已经学完了JavaScript数据结构之栈与队列。本期我们就来一起学习一种新的数据结构——链表。首先,我们需要知道了解链表这种数据结构。

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。——百度百科

总结一下:链表存储有序的元素集合,但其内的元素存储在内存中并不是连续放置的(不同于数组)。链表的每个节点存储数据和下一个节点的指针。下图便是一个链表结构。

image.png

生活中的链表,想必大家对密室逃脱都很熟悉吧,这便是一个链表,一环套一环,一个线索关联着下一个线索。还有就是火车,一节车厢通过车钩(指针)连接下一节车厢,我们对链表的操作大家可以类比到火车上面帮助理解。表头便是火车头,每节车厢对应链表的每个节点。

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() 链表中的元素个数

总结

本期我们接触新的数据结构——链表。并创建了一个链表类(空壳)。下期我们一起实现链表中包含的方法。