JS数据结构(5)——单向链表

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战) 本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。 阅读详情

JS数据结构(5)——单向链表

链表和数组的区别:

数组的优缺点:
  • 数组是最常用的数据结构,它用来存储多个元素。
  • 几乎每一种编程语言中都有默认实现数组结构,并且有很多关于数组的操作方法。
  • 数组的修改和查找操作,时间复杂度低。
  • 数组的创建通常需要申请一段连续的内存空间,并且大小是固定的,所以当当前的数组不能满足容量需求的时候,就需要扩容(一般情况下会申请一个更大的数组,比如说原数组的2倍,然后将原数组中的元素再复制过去),这对空间造成了大量浪费。
  • 而且在数组开头或者中间插入数据的成本非常高,需要进行大量元素的位移。
  • 虽然现在JavaScript的Array类方法已经可以很方便的使用,但是对空间和时间有很大的浪费,消耗程序的性能。
链表的优势:
  • 要存储多个元素,除了数组另外一个选择就是链表。
  • 但是不同于数组,链表中的元素在内存中不需要一定是连续的空间。
  • 链表的每个元素是由一个存储元素本身和一个指向下一个元素的指针做成。
链表相对于数组的优势:
  • 内存空间不需要是连续的,可以充分利用计算机的内存,实现灵活的动态管理、
  • 链表在创建时不需要确定大小,它的大小可以无限的延伸下去。
  • 链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高了很多。
链表相对于数组的劣势:
  • 链表访问任何一个位置的元素,都必须从头开始访问。
  • 链表无法通过下标值直接访问元素,需要从头开始一个一个访问,直到找到对应的元素。

什么是链表(Linked List)

  • 链表和数组一样,都可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。
  • 链表是一系列的存储数据元素的单元通过指针连接起来而形成的,因此每个节点(node)都至少有两个域,一个域用来存储数据元素,另外一个域用来存放指向其他单元的指针。
  • 链表的第一节点和最后一个节点,分别是链表的头节点(head)和尾节点,尾节点的特征是它的next引用为空(null)。链表中每个节点的next引用都相当于一个指针,指向另一个节点。
链表的结构:

在这里插入图片描述

链表结构的封装

  1. 代码思路:
  • 我们需要封装一个 LinkedList 的类,用于表示链表结构。
  • 在LinkedList类中,需要封装一个内部类用于表示每个节点信息(数据的指向下一个单元的指针)。
  • 链表中我们还需要保存两个属性,一个是链表的长度,另一个是链表的第一个节点。
  • 链表中常见的操作:
    (1)append(data):向链表尾部添加一个新的节点。
    (2)insert(position,data):向链表的指定位置插入一个新的节点。
    (3)remove(element):从链表中移除数据为element的一项
    (4)removeAt(position):从链表中移除指定位置的一项。
    (5)update(position):修改某个位置的元素
    (6)get(position):获取对应位置的元素
    (7)indexOf(element):返回element在列表中的索引值,如果没有返回-1。
    (8)isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false。
    (9)size():返回链表包含的元素个数,与length属性类似。
    (10)toString():以String的方式输出链表中元素的值。
  1. 代码实现
function LinkedList() {
  this.head = null;
  // 封装节点node类
  function node(data) {
    this.data = data;
    this.next = null;
  }
  this.length = 0;

  // append(data):向链表尾部添加一个新的节点
  LinkedList.prototype.append = function(data) { 
      // 创建新节点
      var newNode = new node(data);
      // 判断添加的是否是第一个节点
      if(this.length == 0)
        this.head = newNode;
      else {
        var current = this.head;
        while(current.next)
          current = current.next;
        current.next = newNode;
      }
      this.length++;
  }
  // insert(position, data):向链表的指定位置插入一个新的节点
  LinkedList.prototype.insert = function(position, data) {
    // 对position进行越界判断
    if(position < 0 || position > this.length) 
      return false;
    // 创建新节点
    var newNode = new node(data);
    // 判断插入的位置是否是第一个
    if(position == 0){
      newNode.next = this.head;
      this.head = newNode;
    }else {
      var index = 0;
      var current = this.head;
      while(index < position - 1) {
        current = current.next;
        index++;
      }
      newNode.next = current.next;
      current.next = newNode;
    }
    this.length++;
  }
  // get(position):获取对应位置的元素
  LinkedList.prototype.get = function(position) {
    if(position < 0 || position >= this.length)
      return null;
    var current = this.head;
    var index = 0;
    while(index < position) {
      index++;
      current = current.next;
    }
    return current.data;
  }
  // indexOf(element):返回元素在列表中的索引,如果列表中没有则返回-1
  LinkedList.prototype.indexOf = function(element) {
    var current = this.head;
    var index = 0;
    while(current.data !== element){
      current = current.next;
      index ++;
    }
    if(current.data === element)
      return index;
    return -1;
  }
  // update(position, element):修改某个位置的元素
  LinkedList.prototype.updata = function(position, element) {
    if(position < 0 || position > this.length) 
      return null;
    var current = this.head;
    var index = 0 ;
    while(index < position) {
      index ++;
      current = current.next;
    }
    current.data = element;
    return true;
  }
  // removeAt(position):移除链表中位置为position的一项
  LinkedList.prototype.removeAt = function(position) {
    var current = this.head;
    if(position < 0 || position >= this.length) return null;
    if(position === 0) 
      this.head = this.head.next;
    else {
      var index = 0;
      while(index < position - 1) {
        current = current.next;
        index ++;
      }
      current.next = current.next.next;
    }
    this.length --;
    return true;
  }
  // remove(element):移除链表中元素为element的一项
  LinkedList.prototype.remove = function(element) {
    var position = this.indexOf(element);
    return this.removeAt(position);
  }
  // toString():以String的方式输出链表中元素的值
  LinkedList.prototype.toString = function() {
    // 首先获取头节点
    var current = this.head;
    var listString = "";
    // 循环获取后面的节点
    while(current){
      listString += current.data + " ";
      current = current.next;
    }
    return listString;
  }
  // isEmpty():判断链表是否为空,若为空则返回true,否则返回false
  LinkedList.prototype.isEmpty = function() {
    if(this.length === 0)
      return true;
    return false;
  }
  // size():返回链表包含的元素个数
  LinkedList.prototype.size = function() {
    return this.length;
  }
}

// 测试
var list = new LinkedList();

list.append(111);     
list.append(222);
console.log(list.toString());      // 结果为:111 222 

list.insert(1, 333);
console.log(list.toString());     // 结果为:111 333 222
console.log(list.get(1));		  // 结果为:333

console.log(list.indexOf(333));   // 结果为:1
console.log(list.updata(2,999));  // 结果为:true
console.log(list.toString());	  // 结果为:111 333 999 

console.log(list.removeAt(1));	  // 结果为:true
console.log(list.toString());	  // 结果为:111 999 

list.append(444);
list.append(555);
list.append(666);
console.log(list.toString());	  // 结果为:111 999 444 555 666 

list.remove(444);
console.log(list.toString());	  // 结果为:111 999 555 666 

console.log(list.isEmpty());	  // 结果为:false
console.log(list.size());	      // 结果为:4
【python数据挖掘课程】二十八.基于LDA和pyLDAvis的主题挖掘及可视化分析 这是《Python数据挖掘课程》系列文章,前面很多文章都讲解了数据挖掘、机器学习,这篇文章主要讲解LDA和pyLDAvis算法,同时讲解如何读取CSV文本内容进行主题挖掘及可视化展示。文章比较基础,希望对你有所帮助,提供些思路,也是自己教学的内容。推荐大家购买作者新书《Python网络数据爬取及分析从入门到精通(分析篇)》,如果文章中存在错误或不足之处,还请海涵。 目录: 一.显示结果及安装 二.LDA主题挖掘 三.pyLDAvis可视化分析 四.小结 阅读详情

相关推荐

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 424

JavaScript的数据结构与算法(三) —— 单向链表

链表 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本事的节点和一个指向下一个元素的引用组成。相对于传统的数组,链表的一个好处在于,添加或者删除元素的时候不需要移动其他元素。使用链表结构可以克服数组需要预先知道数据大小的缺点(C语言的数组需要预先定义长度),链表结构可以充分利用计算机内存...

weixin_34245169的博客 146

ONNC Open Neural Network Compiler 开源神经网络编译器 一个 开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)部署导入ONNX模型

ONNC是一个集合了开源、模块化、可重用编译器算法和工具链的库,专门针对深度学习加速器(DLA)。ONNC从底层开始构建,旨在将ONNX中间表示(IR)翻译成专有DLA代码。其软件架构设计强调可移植性和可重用性,从而简化了开发新后端的工作。上图展示了ONNC软件栈的顶层框图。软件栈从导入ONNX计算图模型到输出相应的硬件二进制文件,展示了各个功能块。

万有文的博客 1995

javascript中的链表结构—从链表中删除元素

  1.概念   上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remove()方法。   从链表中删除节点的时候,需要先找到这个待删除节点的前面的节点。找到这个节点之后修改它的next属性,使其指向待删除节点的下一个节点,这样就把待删除节点给删除了,是不是很...

weixin_33816611的博客 239

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1438

JS实现常见数据结构:单向链表

链表是一种链式数据结构,每个节点包含两种信息:本身数据和下一节点指针。

3y先生的博客 833

CSR mascon产品深度解析

GRACE数据产品 mascon产品 质量变化 地球重力场

weixin_43047707的博客 4434

数据结构· 删除单链表偶数节点

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下: struct ListNode { int data; struct ListNode *next; }; 函数接口定义: struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *he...

inooll的博客 2852

上下文理解的AI增强方案:AI应用架构师的架构洞察

本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 220

学Simulink——基于扩展卡尔曼滤波(EKF)的列车牵引电机转子温度在线估计仿真

本文介绍了一种基于扩展卡尔曼滤波(EKF)的列车牵引电机转子温度在线估计方法,通过Simulink建模实现。文章首先阐述了EKF在估计电机转子温度中的优势,即利用易测量信号(如电流、电压、转速)在线估计难以直接测量的转子温度,并分析了温升对电机性能的影响。随后详细讲解了电机热电增广模型的构建,包括定子电阻温度关系、一阶热近似模型和PMSM的dq轴方程。接着,文章提供了Simulink建模的详细步骤,包括PMSM+FOC电流环的搭建、EKF算法的实现(推荐使用ExtendedKalmanFilter块或MAT

xiaoheshang_123的博客 56

js(es6)实现单向链表——链表添加、删除、反转方法的实现

1、以下方法中,head指向的节点即头节点的下标(index)为0,即第一个有数据的节点的下标为1。 2、以下方法中,未判断各种特殊情况,如下一个节点不存在的情况,因为如果下一个节点不存在,next为null,正好赋值给了尾节点的next,或正好中断了循环,完全符合逻辑,无需判断各种情况。 3、以下方法未详细描述,可结合链表结构图理解代码

weixin_44607531的博客 899

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

实现JavaScript数据结构链表

模仿《学习JavaScript数据结构与算法》一书, 包含单向链表和双向链表 有es5、es6语法 经过测试 代码地址: 单向链表:单向链表(一般链表) 双向链表:双向链表 可能有错误,欢迎指正...

wang_kai_7的博客 241

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Qwen2.5-VL-7B-Instruct编程能力展示:从需求到完整代码

本文介绍了如何在星图GPU平台自动化部署【ollama】Qwen2.5-VL-7B-Instruct镜像,该镜像具备强大的代码生成能力,能够根据自然语言描述快速生成高质量、可运行的代码,适用于自动化编程、算法实现和快速原型开发等场景,显著提升开发效率。

weixin_36474001的博客 77

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【JS数据结构】单向链表

一. 认识链表 1.数组 1.1 数组的优点 1.2 数组的缺点 2.链表 2.1 相对于数组, 链表有一些优点 2.2 相对于数组, 链表有一些缺点 3.什么是链表 3.1 链表的火车结构 3.2 链表的数据结构 3.3 给火车加上数据后的结构 二. 链表封装 1.创建链表类 1.1 创建一个链表类 1.2 代码解析 2.链表常见操作 2.1append(element)尾部追加数据 2.2 toString()转成字符串 2.3 insert(position

早睡早起长头发的博客 1225

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

js单向链表的基本实现

单向链表 1.单向链表的封装 单链表跟双向链表一样,js里的引用类型有点不太懂,此处的this.head不知道是看做指针还是头结点来使用。 我在这里是把this.head复制了一个节点数据,同时把this.head的看做了指针指向了第一个新节点(不这样想看不下去了),按我的想法插入第一个节点的时候是 this.head.next=newNode.先记...

ab31ab的博客 1080

【数据结构与算法】JavaScript实现单向链表

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

一个前端开发者 533

数据结构(二):单向链表、双向链表

链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有的语言称为指针或连接)组成。类似于火车头,一节车厢载着乘客(数据),通过节点连接另一节车厢。head属性指向链表的第一个节点;链表中的最后一个节点指向null;当链表中一个节点也没有的时候,head直接指向null;双向链表:既可以从头遍历到尾,又可以从尾遍历到头。

weixin_42044763的博客 2952

JavaScript实现单向链表

JavaScript实现单向链表 javascript 数据结构与算法源码 目录JavaScript实现单向链表一、单向链表简介二、封装单向链表类2.0.创建单向链表类2.1.append(element)2.2.toString()2.3.insert(position,element)2.4.get(position)2.5.indexOf(element)2.6.update(position,element)2.7.removeAt(position)2.8.其他方法2.9.完整实现 一、单向链表简

雨的印记的博客 494

JavaScript链表结构——单向链表

JavaScript链表结构——单向链表 //单向链表类 function LinkList(){ //节点类(data为节点保存的数据,next为下一个节点的地址) function Node(data){ this.data = data this.next = null } //初始化链表head指向 this.head = null //初始化链表长度(节点个数) t...

liu_jia_hao的博客 413

图解单向链表原理以及JS实现链表的方法【附源代码】

链表是我们在编程中重要的数据结构,由于它本身的数据特性,我们在开发中会频繁大量的使用链表。那么什么是链表呢?今天我们以单向链表为例子用图片来介绍一下什么是链表。 根据图片我们可以看出来链表的形态就是一条链子的形状,单向链表是在每一个节点中记录它下一个节点的内存地址来进行数据索引的,所以链表是逻辑上的一条链路,在实际内存空间上存储状态可能是这样的。 我们可以将内存理解为一个矩阵阵列,在每一个格子可以存储一些数据,每一个格子有自己相应的地址来访问这个数据,所以我们使用链表的主要用途就是将

keader01的博客 494

javascript——单向链表

链表:存储数据一般可以用数组或者链表,不同于数组的是,链表中的元素不必是连续的空间。链表中的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(指针)组成。

FormAda的博客 1907

【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

上一篇文章讲解了链表的相关知识,并用代码实现了一个链表结构。那么本文将介绍一下另一种特殊的链表结构,叫做 双向链表。 顾名思义,普通的链表都是从 head 开始往后遍历结构内的元素,那么双向链表就是既可以从头开始遍历,又可以从结构的末尾开始遍历。 上一篇文章的跳转链接—— 本文就来详细讲解一下双向链表的概念以及如何实现一个双向链表。 公众号:Lpyexplore的编程小屋 关注我,每天更新,带你在python爬虫的过程中学习前端,还有更多电子书和面试题等你来拿 数据结构——双向链表一、什么是双向链表二

零一的博客 2万+

js数据结构------单向链表

在数据结构中要存储多个元素,除了数组另一个就是链表,不同于数组的是,链表不需要连续的内存空间,不必在创建时就确定大小,链表大小可以无限延伸,在插入和删除数据时,效率会高很多,但是链表在访问任何一个位置的数据时都需要从头开始访问,在查找方面效率会比较低。 链表的每个元素有一个储存元素本身的节点和一个指向下一个元素的引用组成。 对单向链表进行封装: function LinkedList() { ...

iiiicccc的博客 192

数据结构-JS实现单链表、JS实现双链表

链表、单向链表、双向链表 JS实现链表、JS实现单向链表、JS实现双向链表

欢迎访问我的主页:https://www.bookbook.cc 9101
上一篇: JS数据结构(4)——优先级队列
下一篇: JS数据结构(6)——双向链表
echomsy
博客等级 码龄8年 22粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值