js 实现单链表

零基础搭建DeepSeek API调用监控看板:从日志埋点到可视化 在调用外部API服务时,监控与可观测性是保障应用稳定性和成本可控的关键。通过日志埋点记录每一次请求的完整现场,借助轻量级存储如SQLite对调用量、错误率、Token消耗和延迟等指标进行统计分析,再配合可视化看板实时呈现趋势,即使不具备SRE背景的开发者也能快速搭建属于自己的监控体系。本文以DeepSeek API调用为场景,详细展示从字段设计、Python封装埋点、SQL查询到Flask+ECharts可视化看板的完整实现路径,帮助个人开发者和小团队低成本掌握API监控的核心方法,实现成本预测、异常告警与 阅读详情

最近在 leetcode 刷题时发现需要用到链表,但是 js 中没有链表这种数据类型,故自己实现一个简单的单链表。

先科普一下链表:

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。

总结一下:数组查询快增删慢(插入元素时需要移动其他元素),链表查询慢(需要从头开始遍历)增删快。

链表实现类:

// 节点类
function Node (val) {
  this.val = val
  this.next = null
}

// 链表类
function NodeList () {
  this.head = null
  this.length = 0
  // 向链表末尾追加元素
  this.push = push
  // 在值为 val 的节点后面添加一个值为 newVal 的节点
  this.insertAfter = insertAfter
  // 在链表中查找值为 val 的节点
  this.find = find
  // 在链表中查找值为 val 的节点的前一个节点
  this.findPrev = findPrev
  // 删除链表中值为 val 的节点
  this.remove = remove
  // 将值为 val 的节点修改为 newVal
  this.update = update
  // 打印链表
  this.toString = toString
}

function push (val) {

  let node = new Node(val)
  // 第一个节点
  if (this.head === null) {
    this.head = node
  } else {
    let current = this.head
    // 找到最后一个节点
    while (current.next !== null) {
      current = current.next
    }
    // 最后一个节点后面追加节点
    current.next = node
  }
  this.length++

}

function insertAfter (val, newVal) {

  let current = this.find(val)
  if (current === null) return -1
  let node = new Node(newVal)
  // 先将当前节点的指向给到新节点的指向
  node.next = current.next
  // 再将当前节点指向新节点
  current.next = node
  this.length++

}

function find (val) {

  // 空链表
  if (this.head === null) return null
  let current = this.head
  // 查找到最后一个节点之前
  while (current.next !== null) {
    if (current.val === val) return current
    current = current.next
  }
  // 判断最后一个节点
  if (current.val === val) return current
  return null

}

function findPrev (val) {

  // 空链表或者查找第一个节点的前一个节点均查不到
  if (this.head === null || this.head.val === val) return null
  let current = this.head
  // 最后一个节点不进循环,最后一个节点不可能是某个节点的前一个节点
  while (current.next !== null) {
    if (current.next.val === val) return current
    current = current.next
  }
  return null

}

function remove (val) {

  let current = this.find(val)
  if (current === null) return -1
  else {
    let prev = this.findPrev(val)
    if (prev !== null) {
      prev.next = current.next
    } else {
      this.head = current.next
    }
  }
  this.length--

}

function update (val, newVal) {

  let current = this.find(val)
  if (current === null) return -1
  current.val = newVal

}

function toString () {

  let current = this.head
  let str = ''
  let index = 0
  while (current !== null) {
    // str += index + current.val + (current.next ? ' -> ' : '')
    str += `(${index}) ${current.val}${current.next ? ' -> ' : ''}`
    current = current.next
    index++
  }
  console.log(str)

}

测试代码:

let nodeList = new NodeList()

nodeList.push('1st element')
nodeList.push('2nd element')
nodeList.push('3rd element')
nodeList.push('4th element')

console.log('find', nodeList.find('1st element'))
console.log('find', nodeList.find('2nd element'))
console.log('find', nodeList.find('3rd element'))
console.log('find', nodeList.find('4th element'))

console.log('findPrev', nodeList.findPrev('1st element'))
console.log('findPrev', nodeList.findPrev('2nd element'))
console.log('findPrev', nodeList.findPrev('3rd element'))
console.log('findPrev', nodeList.findPrev('4th element'))

nodeList.remove('4th element')
console.log('length', nodeList.length, 'nodeList', nodeList)

nodeList.insertAfter('2nd element', '2nd element 2')
console.log('length', nodeList.length, 'nodeList', nodeList)

nodeList.update('2nd element', '2nd element update')
console.log('length', nodeList.length, 'nodeList', nodeList)

nodeList.toString()

代码详情请戳 ===> NodeList

SAP Workflow 工作流开发步骤总结 SAP WORKFLOW 阅读详情

相关推荐

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3944

JS 数据结构:链表

本文介绍了什么是链表以及他的优缺点,并分别介绍了单链表、双向链表和循环链表之间的细微差别和各自的特点,一些有明显差异的操作都分别给出了图和代码,更易于理解和实践。

weixin_46015333的博客 4444

MC1496乘法器AM调制电路搭建全流程(附Multisim 14.0仿真文件)

本文提供了基于MC1496乘法器搭建AM调制电路的完整实战指南。针对仿真模型缺失的痛点,详细讲解了从晶体管级手动构建MC1496等效模型,到外围电路设计、调制度参数计算与调节,并在Multisim 14.0中进行仿真验证的全流程。通过深度剖析MC1496内部原理与AM信号调制机制,帮助读者获得从仿真到实践的可控设计与排错能力。

weixin_29190169的博客 595

js创建链表

js创建链表。

weixin_64697722的博客 881

“挑战杯”大赛“揭榜挂帅”赛道-baseline解析

在这个脚本中,txt文件的保存路径为'yolov7/datasets/Fatigue_driving_detection/txt_labels/',而xml文件的路径为'./label_xml/'。标注图片后的产物是会给每一个图片对应生成一个xml格式的文件,但是如果要用yolo框架去训练模型,输入的数据必须是txt格式,因此这里有一步转换格式的过程。注意看:obs这里有三个文件夹,第一个是关键帧的文件夹A,第二个是标注时输出的位置为文件夹B,第三个是智能标注后和手动标注的合集文件夹C。

m0_62899814的博客 2322

把对讲门铃(控制底楼铁门)接入米家服务器

今天讲个跟SDR或者无人机无关的东西,技术含量不高,但是方便了我的生活。 现在家门有智能锁,汽车也可以远程解锁发动,NFC门禁也可以用某些手机复制,唯独楼下的铁门,必须用老式对讲门铃控制。 也就是说其它钥匙都可以不带,就剩这个钥匙还必须随身携带。 另外有时候人不在家,不能开楼下铁门,快递员也没法把东西送上楼。 ......

老邵的开源世界 6551

用JS实现链表 --单链表

用JS实现单链表

weixin_43850639的博客 1549

V90伺服 EPOS模式下回原(详细配置+SCL源代码)

/ 输出上限 100.0%rSetPoint : Real;// 设置目标值工程量。// 通道转换参考值。Td : Real;

RXXW_Dor的博客 2666

JavaScript【链表】

双向链表:既可以从头遍历到尾,又可以从尾遍历到头。也就是说链表连接的过程是双向的,它的实现原理是:一个节点既有向前连接的引用,也有一个向后连接的引用。每次在插入或删除某个节点时,都需要处理四个引用,而不是两个,实现起来会困难些;相对于单向链表,所占内存空间更大一些;但是,相对于双向链表的便利性而言,这些缺点微不足道。双向链表不仅有head指针指向第一个节点,而且有tail指针指向最后一个节点;item储存数据、prev指向前一个节点、next指向后一个节点;

m0_63077733的博客 2087

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

YOLOv8-COCO指标转换

本文介绍了将YOLO格式数据集转换为COCO格式并评估模型性能的完整流程。首先需将YOLO格式的标注数据转换为COCO格式,通过修改classes、image_path等参数适配不同数据集。然后使用YOLO模型对验证集进行预测并保存结果为JSON格式。最后通过比较预测结果和转换后的COCO标注文件,使用COCO官方评估指标和TIDE工具进行性能分析,生成包含AP、AR等指标的报告及错误分析图表。整个过程实现了从数据准备到模型评估的完整闭环,为计算机视觉任务提供标准化的性能评估方案。

FJN110的博客 403

JavaScript实现单向链表

链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有的语言称为指针或连接)组成。类似于火车头,一节车厢载着乘客(数据),通过节点连接另一节车厢。head属性指向链表的第一个节点;链表中的最后一个节点指向null;当链表中一个节点也没有的时候,head直接指向null;数组的创建通常需要申请一段连续的内存空间(一整块内存),并且大小是固定的。所以当原数组不能满足容量需求时,需要扩容。

qwe02315的博客 417

2026华为OD机考新系统真题 + 双机位C卷 + 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2026年4月1日起,华为OD机试正式切换至新系统模式!采用力扣模式,无需自己写输入! 难度大幅度降低。正在备考华为OD机试的同学,优先刷新系统机试真题,可大幅提升通过率。 新系统考题考点与旧版一致,无需重新适应。本专栏所有算法题均配有详细思路解析,并提供C语言、JS、C++、Python、Go、Java多语言源码实现。订阅后私信即可开通专属OJ刷题权限,高效备考一次上岸!

算法大师! 45万+

JavaScript实现单链表

最近看数据结构单链表,想着怎么用JS实现,接触JS也很长时间了,总觉得自己写的代码不好,还需要更多的实践呀。这是最近看到的一篇实现JS单链表的文章。 本文转载于:http://www.byywee.com/page/M0/S249/249957.html点击打开链接 JavaScript实现单链表 当前链表数据 操作方法:把数据写入下面的text,使用按钮add添加,del删

zhu1988renhui的专栏 622

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Javascript实现的单链表

今天无聊看了看大二的数据结构的书,于是用熟悉的js来写了个单链表......

唐光仔的博客 557

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

js实现单链表、单链表循环

链表 是一种物理存储单元上非线性、非连续的数据结构。每个节点由数据域(存储的数据值)和指针域(存储的是指针信息指向链表的下一个或上一个元素)组成。正式由于指针的存在,链表在物理存储上是非连续的。 特点: 添加、删除节点效率高,只需要操作指针的指向即可 链表长度是无限制的,可动态的变化长度 js 实现单链表 function LinkedList() { let Node = funct...

zlq_优快云的博客 575

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JS实现单链表

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

庸人方自扰,自在就好 649

javascript实现单链表

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34363171的博客 118

js单链表的实现

js简单实现单链表

weixin_45880538的博客 335

Js实现单链表操作

// 链表 // 创建节点的构造函数 function Node(element) { this.element = element // 初始的节点的next指向都为 null this.next = null } // 创建 链表类 function LList() { // 链表类的第一个头节点 this.head = new Node("head") } // ...

weixin_42714574的博客 369

用JavaScript实现功能齐全的单链表

前言 前端也要搞好数据结构哦!! 用JavaScript实现了个单链表,通过LinkedList构造函数可实例化一个单链表数据结构的对象,所有的方法放到LinkedList构造函数的原型对象上,写了暂时能想到的所有方法 GitHub源码地址,下载可运行 实现 通过LinkedList的类创建链表实例,链表下有添加,查找,删除,显示节点等...

weixin_33966095的博客 72

数据结构(3) JS实现单链表

链表有单链表和双链表,概念可百度,这里主要是以js的形式实现。 以下是我大概实现的思路 我们先定义一个类,说明一下这个链表的数据结构 所以我们需要定义节点,节点里面有value(我们存储的值)以及next(指向下个一节点) function node(value){ this.value = value; this.next = null; //在没有下一...

YmwWow的博客 297

JavaScript 实现带头单链表

在 JavaScript 中,我们使用数组来进行有序序列的数据存放,方便省事,而且在 JavaScript 中我们不需要担心数组大小不够扩容问题,并且找某个位置上的数据的复杂度为 O(1),但是在任意位置上删除和添加的平均时间复杂度为 O(n),我们使用链表的删除和增加时间复杂度是为 O(1) 的,所以我们来实现一个单链表。 class Node { constructor(data) { this.data = data; this.next = null; .

m0_60703077的博客 657

JavaScript 实现数据结构之单链表

利用JavaScript来实现数据结构中的单链表 // 链表中需要一个Node类 来表示节点 其中的element为数据 next为指针 function Node(element) { this.element = element; this.next = null; } // linkedList类 来为插入节点,删除节点,显示列表提供方法,以及其他的辅助方法 function linkedList() { this.head = new Node("head"); ..

Do_it 173

JavaScript 单链表实现

/* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素 */ var LinkedList = function () { var length = 0; var head = null; /* 获取单链表的长度 */ this.size = function () { retur...

oLaoJiang1的博客 235
上一篇: 基于 jQuery.i18n.properties 对老项目实现国际化
下一篇: CentOS7下卸载与安装MySQL
趣果有间
博客等级 码龄10年 15粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值