JavaScript 链表

news2024/11/26 9:34:26
(成功的唯一秘诀——坚持最终一分钟。——柏拉图)

在这里插入图片描述

链表

众所周知,数组的查询比链表快,但插入比链表慢。

这是因为链表是一种动态的数据结构,不同于数组的是,链表分配内存空间的灵活性,它不会像数组一样被分配一块连续的内存。当你想在数组的任意位置,插入一个新值的时候,必须对数组中的各个元素进行相应的位置移动才能达到目标,开销显然是很大的。然而链表的灵活性在于它的每个元素节点分为两部分,一部分是存储元素本身,另一部分是指向下一个节点元素的引用,也可以称为指针,当你要插入数据时,把上一个节点的向下指针指向新数据节点,新数据节点的向下指针指向原有数据。但是链表不像数组那样可以直接通过索引立刻定位,只能通过遍历。

JavaScript实现链表

function LinkedList() {
  this.length = 0;
  this.head = null;
}

function Node(val) {
  this.val = val;
  this.next = null;
}

LinkedList.prototype.getNodeByIndex = function (idx) {
  if (typeof idx !== "number") throw new Error("id is not valid");
  if (idx < 0 || idx >= this.length) return null;
  let cur = this.head;
  while (idx--) {
    cur = cur.next;
  }
  return cur;
};

LinkedList.prototype.append = function (val) {
  let node = new Node(val);
  if (this.length === 0) {
    this.head = node;
  } else {
    this.getNodeByIndex(this.length - 1).next = node;
  }
  this.length++;
};

LinkedList.prototype.insert = function (pos, val) {
  if (pos < 0 || pos >= this.length) return false;
  let node = new Node(val);
  if (pos === 0) {
    node.next = this.head;
    this.head = node;
  } else {
    let prev = this.getNodeByIndex(pos - 1);
    node.next = prev.next;
    prev.next = node;
  }
  this.length++;
  return true;
};

LinkedList.prototype.removeAt = function (pos) {
  if (pos < 0 || pos >= this.length) return false;
  if (pos === 0) {
    this.head = this.head.next;
  } else {
    let prev = this.getNodeByIndex(pos - 1);
    prev.next = prev.next.next;
  }
  this.length--;
  return true;
};

为什么JavaScript没有提供内置的链表api?

目前并没有权威的机构来说明这个问题,但从js的发展史来看,也可以得出一些原因

  1. 使用链表的主要目的是提高性能,当有大量记录并且频繁更改它们时,链表有助于优化它。但对于大多数 JavaScript 应用程序而言,情况可能并非如此。对于 JavaScript,数组几乎可以做到这一点
  2. 大多数框架都依赖于数组,无论是 React、Vue 等。
  3. 当你需要对一个巨大的列表进行大量修改时,使用链表是合理的——尤其是在列表末尾以外的地方添加或删除项目时,这种情况在 JavaScript/前端中很少见。
  4. 在过去,js主要针对的是web端开发,而在web端的性能瓶颈在io,所以对于部分性能方面的api并没有提供
  5. 最后但并非最不重要的一点是,JavaScript 对数组有很好的支持,但您必须编写自己的实现代码或使用一些提供链表实现的库。
  6. 其他原因

链表的种类和区别

  1. 单链表
    每个节点只有一个指针域,指向下一个节点。单链表的插入和删除操作比较简单,但是查询慢。
  2. 双链表
    每个节点有两个指针域,分别指向前一个节点和后一个节点。双链表可以方便地实现双向遍历,但是占用空间比较大。
  3. 循环链表
    尾节点的指针域指向链表的头节点。循环链表比单链表和双链表的查询效率更高,但是在插入和删除操作时需要注意维护链表的结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决车载U盘:USB设备未连接 问题

U盘是一种常用的便携式存储设备&#xff0c;用于存储和传输数据。在U盘上使用的文件系统类型决定了它可以支持的文件大小、安全性和其他特性。以下是几种常见的U盘文件系统类型&#xff1a; 1. FAT32:这是U盘上最常用的文件系统类型之一。FAT32文件系统支持的最大文件大小为4GB…

Revit楼板:建筑楼板和结构楼板区别和垫层生成

一、Revit中建筑楼板和结构楼板的区别 Revit中&#xff0c;在我们做项目时楼板是最常见的结构之一&#xff0c;几乎每次都需要使用它。分为建筑楼板和结构楼板&#xff0c;是不是有很多小伙伴就很好奇,为什么分为两种楼板&#xff0c;那么他们是什么时候使用的呢?之间又有何区…

从测试小白成功转型自动化测试,我是如何一步步掌握坚持下来的?

目录 学习自动化测试的初衷 克服困难&#xff0c;掌握自动化测试技能 自动化测试在日常工作中的应用 第一个自动化测试脚本的完成 自动化测试技能带来的机会和挑战 【自动化测试工程师学习路线】 学习自动化测试的初衷 作为一名测试新人&#xff0c;刚进入测试行业的时候…

工业视觉检测的8个技术优势

工业4.0时代&#xff0c;自动化生产线成为了这个时代的主旋律&#xff0c;而工业视觉检测技术也成为其中亮眼的表现&#xff0c;其机器视觉技术为设备提供了智慧的双眼&#xff0c;让自动化的脚步得以加速&#xff01; 在实际的生产应用中&#xff0c;视觉技术方案往往先被着手…

zed2i相机中imu内参的标定及外参标定

zed2i中imu内参的标定 参考&#xff1a; https://blog.csdn.net/weixin_42681311/article/details/126109617 https://blog.csdn.net/weixin_43135184/article/details/123444090 值得注意&#xff0c;imu内参的标定其实不是那么重要&#xff0c;大致上给一个值应该影响不大…

金字塔特征融合

金字塔的三种主要结构 FPN: Feature Pyramid Networks for Object Detection (CVPR 2017) PANet: Path Aggregation Network for Instance Segmentation (CVPR 2018) BiFPN: EfficientDet: Scalable and Efficient Object Detection (CVPR 2020) Deep High-Resolution Repre…

神奇哈哈镜-第14届蓝桥杯省赛Scratch初级组真题第3题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第132讲。 神奇哈哈镜&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第3题&#…

颜值经济崛起,伽蓝开启采购数字化之旅

今天&#xff0c;数字化转型已成为颠覆性力量&#xff0c;很多行业被裹挟其中&#xff0c;或主动或被动&#xff0c;美妆行业也不例外。 作为国内最大的化妆品企业之一的伽蓝&#xff0c;在过去的几年当中&#xff0c;一直是以 7% 到 10% 的速度快速增长&#xff0c;在此过程中…

计算机组成原理---第二章 习题详解版

(一&#xff09;课内习题 1. &#xff08;二&#xff09;课后练习 1.写出下列各整数的原码、反码和补码表示&#xff08;用8位二进制表示&#xff09;。其中MSB是最高位&#xff08;符号位&#xff09;&#xff0c;LSB是最低位。 &#xff08;1&#xff09;-35 &#…

DVWA之文件包含漏洞

文件包含漏洞原理 1、什么是文件包含 程序开发人员一般会把重复使用的函数写到单个文件中&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;而无需再次编写&#xff0c;这中文件调用的过程一般被称为文件包含。 2、文件包含漏洞 程序开发人员一般希望代码更灵活&a…

自学网络安全【黑客】,一般人我劝你还是算了吧

前言&#xff1a;我是劝一般人算了&#xff0c;看你是一般人还是。。。 一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全2.不要刚开始就深度学习网络安全3.收集适当的学习资料4.适当的报班学习二、学习网络安全的些许准备 1.硬件选择2.软件选择3.外语能力三、网…

数据结构:双向链表(带头循环)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下数据结构方面有关双向链表的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a…

时至今日,Linux会开源,也是一种态度

什么是开源&#xff1f;开源通常指开发者公开系统/应用程序源代码。通过对代码进行共享和重用&#xff0c;可以快速开发出高质量、低维护成本的应用程序。这意味着你不再需要花很多时间来学习新技术或编写复杂的代码。 一、Linux永远的神 就拿linux来举例子。 Linux系统的发起…

分享Python采集190个jQuery代码,总有一款适合您

分享Python采集190个jQuery代码&#xff0c;总有一款适合您 Python采集的190个jQuery代码下载链接&#xff1a;https://pan.baidu.com/s/1KxEOw7IfgZJq7yhYBM1nwg?pwdz3r1 提取码&#xff1a;z3r1 可拖拽的谷歌样式纯javascript模态窗口插件 简单实用的轻量级jQuery评分插…

ubuntu系统配置大恒相机驱动并读取ros话题

文章目录 0. 说明1. 安装大恒相机sdk1.1 下载1.2 安装sdk(用于配置ip和调试相机参数)(1) 电脑网卡配置(网卡固定ip)(2)查看相机图像以及配置相机参数 2. 安装ros驱动包(注&#xff1a;大恒相机官方没ros驱动)2.0 正确流程2.1 错误示范2.1 报错1--缺包2.2 报错2--包编译顺序问题…

CnOpenData缺陷产品召回数据

一、数据简介 缺陷产品召回&#xff0c;是指缺陷产品的生产商、销售商、进口商在得知其生产、销售或进口的产品存在可能引发消费者健康、安全问题的缺陷时&#xff0c;依法向职能部门报告&#xff0c;及时通知消费者&#xff0c;设法从市场上、消费者手中收回缺陷产品&#xff…

Python神经网络学习(六)--机器学习--强化学习

前言&#xff1a; 属实是失踪人口回归了。继续神经网络系列。 强化学习&#xff1a; 强化学习也是一个很重要的方向了&#xff0c;很多人用强化学习玩游戏&#xff0c;可能有人觉得强化学习很难&#xff08;包括我&#xff09;&#xff0c;但是我今天用网上流传很广的、很经…

error: static assertion failed: std::atomic requires a trivially copy type

1. 报错信息 编译期错误&#xff0c;gcc version 7.5.0 错误示例代码&#xff1a; #include <atomic> #include <iostream> #include <vector>int main() {std::atomic<std::vector<int>> a; }2. 问题分析 报错信息里明确说了&#xff0c;ato…

商品说明书的翻译,中译英如何翻译效果好?

众所周知&#xff0c;国内产品进入国际市场&#xff0c;商品说明书的翻译是必不可少的&#xff0c;译文必须以准确的语言表达出原文的信息。那么&#xff0c;针对商品说明书翻译&#xff0c;中译英如何翻译效果好&#xff1f; 业内人士指出&#xff0c;很多商品说明书包含有关产…

学习PCL库:PCL库中的geometry模块介绍

公众号致力于点云处理&#xff0c;SLAM&#xff0c;三维视觉&#xff0c;高精地图等领域相关内容的干货分享&#xff0c;欢迎各位加入&#xff0c;有兴趣的可联系dianyunpcl163.com。未经作者允许请勿转载&#xff0c;欢迎各位同学积极分享和交流。 geometry模块介绍 PCL库中的…