JavaScript 链表结构

链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同.

这一章中, 我们就来学习一下另外一种非常常见的用于存储数据的线性结构: 链表.

一、认识链表 

我们先来认识一下链表, 看一下它大概的机制和原理, 以及和数组的对比. 

链表和数组 

  • 数组
    • 要存储多个元素,数组(或列表)可能是最常用的数据结构。
    • 我们之前说过, 几乎每一种编程语言都有默认实现数组结构, 这种数据结构非常方便,提供了一个便利的[]语法来访问它的元素。
  • 但是数组也有很多缺:
    • 数组的创建通常需要申请一段连续的内存空间(一整块的内存), 并且大小是固定的(大多数编程语言数组都是固定的), 所以当当前数组不能满足容量需求时, 需要扩容. (一般情况下是申请一个更大的数组, 比如2倍. 然后将原数组中的元素复制过去)
    • 而且在数组开头或中间位置插入数据的成本很高, 需要进行大量元素的位移.(尽管我们已经学过的JavaScript的Array类方法可以帮我们做这些事,但背后的原理依然是这样)
  • 链表
    • 要存储多个元素, 另外一个选择就是使用链表.
    • 但不同于数组, 链表中的元素在内存中不必是连续的空间.
    • 链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针或者链接)组成.
    • 相对于数组, 链表有一些优点:
      • 内存空间不是比是连续的. 可以充分利用计算机的内存. 实现灵活的内存动态管理.
      • 链表不必在创建时就确定大小, 并且大小可以无限的延伸下去.
      • 链表在插入和删除数据时, 时间复杂度可以达到O(1). 相对数组效率高很多.
    • 相对于数组, 链表有一些缺点:
      • 链表访问任何一个位置的元素时, 都需要从头开始访问.(无法跳过第一个元素访问任何一个元素).
      • 无法通过下标直接访问元素, 需要从头一个个访问, 直到找到对应的问题.

什么是链表 

  • 其实上面我们已经简单的提过了链表的结构, 我们这里更加详细的分析一下.

  • 链表类似于火车: 有一个火车头, 火车头会连接一个节点, 节点上有乘客, 并且这个节点会连接下一个节点, 以此类推.

  • 链表的火车结构:

  • 链表的数据结构 

二、链表封装 

 创建链表类

// 封装链表的构造函数
function LinkedList() {
    // 封装一个Node类, 用于保存每个节点信息
    function Node(element) {
        this.element = element
        this.next = null
    }

    // 链表中的属性
    this.length = 0  // 链表的长度
    this.head = null // 链表的第一个节点
    
    // 链表中的方法
}

链表常见操作 

  • 我们先来认识一下, 链表中应该有哪些常见的操作
    • append(element):向列表尾部添加一个新的项
    • insert(position, element):向列表的特定位置插入一个新的项。
    • remove(element):从列表中移除一项。
    • indexOf(element):返回元素在列表中的索引。如果列表中没有该元素则返回-1
    • removeAt(position):从列表的特定位置移除一项。
    • isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值