JavaScript单向链表结构

2023-11-17

JavaScript单向链表结构:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>单向链表</title>
</head>

<body>
  <h1>见控制台打印</h1>
  <button id="tian">添加</button>
  <button id="yichu">移除</button>
  <button id="dayin">打印</button>
  <button id="long">长度</button>

  <script>
    /*链表结构
    添加节点:append   查找节点:find    指定数据后添加节点:insert  
    删除节点:remove   返回length:size
    */

    let LinkedList = (function () {
      //避免外部访问
      let HEAD = Symbol();
      //存储数据与next节点的类
      class Node {
        constructor(data) {
          this.data = data;   //存储数据
          this.next = null;   //指向下一节点
        }
      }

      return class {
        constructor() {
          //数据链头
          this[HEAD] = null;
        }
        //尾部追加数据
        append(data) {
          //创建对应的链节点
          let node = new Node(data);

          //获取链头
          let head = this[HEAD];
          // console.log(head)
          //         debugger;
          //如果是链头 则null
          if (head === null) {
            this[HEAD] = node;
            return;
          } else { //如果不是链头
            //如果不是链头  循环找到链尾
            while (head.next !== null) { //最后一个head.next=null的数据会被赋值给head
              //一直把head.next提取出来 直到最后一个数据的next赋值给head
              head = head.next;
            }
            //之后让最后一个head的next等于新添加的node
            head.next = node;
          }
        }
        //取值
        find(index) {
          let head = this[HEAD];
          let i = 0;
          while (head) {
            if (i === index) return head;
            head = head.next;
            i++;
          }
          //超出长度返回null
          return null;
        }
        //插入 (index前面插入)
        insert(index, data) {
          let newNode = new Node(data);
          //当前index后面对应的node数据链
          let nodeBefore,
            nodeAfter = this.find(index);

          //考虑index=0的情况
          if (index === 0) {
            //头等于传进来的数据
            this[HEAD] = newNode;
          } else {
            //获取前一个数据 从而插入到前一个数据后面
            nodeBefore = this.find(index - 1);
          }
          //有往下执行 插入到前一个数据后面
          nodeBefore && (nodeBefore.next = newNode);
          //尾部接上以前的数据 这样就算是头部插入数据
          newNode.next = nodeAfter;
        }
        //移除
        remove(index) {
          //当前index后面对应的node数据链
          let nodeBefore,
            nodeAfter = this.find(index+1);

          //考虑index=0的情况
          if (index === 0) {
            //直接等于0后面的数据
            this[HEAD] = nodeAfter;
          } else {
            //获取前一个数据 从而插入到前一个数据后面
            nodeBefore = this.find(index - 1);
            nodeBefore.next = nodeAfter;
          }
        }
        //打印
        print() {
          let head = this[HEAD],
              arr = [];
          while (head){
            arr.push(head.data);
            head = head.next;
          }
          return arr;
        }
        //长度
        size() {
          let i=0,
              head = this[HEAD];
          while(head){
            head = head.next;
            i++;
          }
          return i;
        }
      }
    })();

    let linked = new LinkedList;
    //存数据
    linked.append("派大星0");
    linked.append("派大星1");
    linked.append("派大星2");
    //查看数据
    console.log(linked);
    //取值
    console.log(linked.find(1));
    //插入
    tian.onclick = function () {
      linked.insert(1, '海绵宝宝');
      console.log(linked);
    }
    //移除
    yichu.onclick = function () {
      linked.remove(1);
      console.log(linked);
    }
    //打印
    dayin.onclick = function () {
      console.log(linked.print());
    }
    //长度
    long.onclick = function () {
      console.log(linked.size());
    }
  </script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript单向链表结构 的相关文章

  • 从 json 数组中获取成对的值

    首先 这是我从 php 源获取的 json 值 oid 2 cid 107 oid 4 cid 98 oid 4 cid 99 之后 我想要得到并且oid值以及相应的cid值例如 oid 2 and cid 107一口气 oid 4 and
  • JavaScript Array.length 属性是函数还是简单变量?

    我有以下 JavaScript 代码 我已经使用 new 关键字初始化了一个数组 因此创建了该数组对象的一个 新实例 然后 我通过向数组添加元素来填充该数组 然而我认为我犯了一个根本性的误解 代码的下一部分让我非常困惑 如果它不够清楚或者完
  • model.save() 返回无效输出

    我正在使用本文中的 Node js mongodb 和express 对 REST Api 进行简单测试 MERN 第一部分 使用 Node js 和 Express 构建 RESTful API https medium com week
  • nuxt如何访问javascript文件中的env

    我无法在 nuxt 2 15 之外访问我的环境变量 当我部署时我可以看到 nuxt context config在浏览器中有正确的变量 但在自定义js文件中我无法访问process env baseURL它返回未定义 nuxt config
  • 从一个页面导航到另一个页面时,JavaScript 不会执行

    我正在构建我的第一个 Ruby on Rails 应用程序 并尝试创建一个动画导航栏 我正在使用 jQuery 和 Turbolink 这是我的application js under app assets javascripts docu
  • 克隆元素对应表单中所有元素的事件

    我成功克隆了表行 其中包含从数据库检索的值 不过我对它没有什么问题 我对所有元素使用了类 因为克隆会重复 ID 不会出现问题 因为它无法唯一地定位每个元素 使每个元素 行在这里唯一的方法是什么 功能如何工作 当第一次选择框时 所选 ID 的
  • 为什么Google的闭包库不使用真正的私有成员?

    我成为 JavaScript 开发人员已经有一段时间了 我一直认为在 JavaScript 中实现私有成员的正确方法是使用 Doug Crockford 在这里概述的技术 http javascript crockford com priv
  • 监听外部事件。 Bash 到 NodeJS 的桥梁

    在 NodeJS 进程内部 我如何监听来自 bash 的事件 例如 NodeJS side obj on something function data console log data Bash side do something Hel
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • 什么是{| ... |} 在 JavaScript 中是什么意思? [复制]

    这个问题在这里已经有答案了 通读 javascript 代码库 我遇到了如下代码块 export type RouteReducerProps error Error isResolving boolean isResolved boole
  • Jasmine 单元测试不等待承诺解析

    我有一个有角度的服务 它具有像这样的异步依赖项 function angular module app factory myService q asyncService function q asyncService var myData
  • 验证动态添加的输入字段

    我用过this http docs jquery com Plugins Validation以下表单的 jquery 验证插件
  • Angular2,测试和解析数据:如何测试 ngOnInit?

    我正在通过Angular2 测试指南 https angular io docs ts latest guide testing html并希望编写一个测试ngOnInit 功能 那个来自编程指南的路由部分 https angular io
  • 新部署后,React 应用程序必须清除浏览器缓存

    我们正在使用 Jenkins 管道在 apache 服务器上部署 React 应用程序 当我们部署新代码时 大多数新功能都可以正常工作 但并非所有更改都反映浏览器中的最新内容 用户必须打开隐身窗口或清除缓存才能看到新功能 我见过一些相关的解
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 如何使用 Ajax 在 Flask 中发布按钮值而不刷新页面?

    我有一个问题 当我单击 Flask 应用程序中的按钮时 我想避免重新加载 我知道有 Ajax 解决方案 但我想知道如何将我的按钮链接到 ajax 函数以发布按钮值并运行链接到其值的 python 函数 这是我的 html 按钮 div di
  • 如何运行 Mike Bostock 的 D3 示例?

    我一直在尝试经营迈克博斯托克透视地球仪 http bl ocks org mbostock 6747043例如 但是如果您尝试在本地重现它 则对其 json 文件的引用是不正确的 问题来自于这行代码 d3 json mbostock raw
  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节
  • React 嵌入脚本标签不可样式化

    我打算将 SurveyMonkey 调查嵌入到我的网站中 用 React 制作 只是让它工作起来很麻烦 但最终这段代码工作了 let script let extractScript
  • 表单帖子上的 asp.net mvc 编码

    我在我的 asp net mvc 表单 带有文本区域的 nicedit 中使用富文本编辑器 当我在帖子上提交表单时 因为它不是 html 编码的 我收到以下消息 从客户端检测到潜在危险的 Request Form 值 如何对 post 上的

随机推荐

  • 两数之和 暴力美学 哈希表

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 leetcode 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出
  • 常见模拟电路设计 一(含仿真):方波、三角波、正弦波的互相发生

    FPGA最近有些整累了 给大家开个模拟电路设计的坑 内含干货 请放心食用 一 总体设计方案 二 单元电路设计和原理说明 2 1方波发生电路 波形发生电路可以由集成运放芯片构成运算电路来实现 第一步的方波发生电路 可以由滞回比较器和RC电路构
  • midjourney上线slack,国内也能用上啦!mjslackbot

    Mjslackbot 国内免费免魔法的原版midjourney 跟discord上的操作一模一样 在频道中描述你的关键词 既可生成精美的图案 手把手教学 1 注册Slack https slack com intl zh cn 注册成功后会
  • 解决word页码混乱并使页码从指定页开始

    解决word页码混乱并使页码从指定页开始 1 解决word页码混乱 页码混乱是由于误加了分节符导致的结果 导致页码不按照物理顺序排序 因此 我们在大纲模式下删除所有分节符 重排页码 2 从指定页重排页码 在指定页页眉位置点击布局 选择分隔符
  • Kafka3.0.0版本——消费者(消费者组案例)

    目录 一 消费者组案例 1 1 案例需求 1 2 案例代码 1 2 1 消费者1代码 1 2 2 消费者2代码 1 2 3 消费者3代码 1 2 4 生产者代码 1 3 测试 一 消费者组案例 1 1 案例需求 测试同一个主题的分区数据 只
  • cmake(三十二)Cmake之find_package指令

    一 cmake帮助文档 find package命令详解 1 help command list cmake 内置命令 列表 2 help comamnd
  • 使用LogHub进行日志实时采集

    日志服务LogHub功能提供日志数据实时采集与消费 其中实时采集功能支持30 种手段 这里简单介绍下各场景的接入方式 数据采集一般有两种方式 区别如下 我们这里主要讨论通过LogHub流式导入 实时 采集 方式 优势 劣势 例子 批量导入
  • QSS-Qt样式表一

    QSS即Qt StyleSheet Qt样式表 的简称 是一种用来自定义控件外观的强大机制 QSS可以让我们的程序界面更加漂亮 每条QSS样式都由两部分组成 1 选择器 该部分指定要美化的控件 2 声明 该部分指定要在控件上使用的属性 声明
  • 一直在说高并发,多少QPS才算高并发?

    高并发的四个角度 只说并发不提高可用就是耍流氓 可以从四个角度讨论这个问题 首先是无状态前端机器不足以承载请求流量 需要进行水平扩展 一般QPS是千级 然后是关系型数据库无法承载读取或写入峰值 需要数据库横向扩展或引入nosql 一般是千到
  • XShell连接ubuntu20.04.LTS

    1 下载Xshell XShell官方下载地址 打开XSHELL官方下载地址 我们可以选择 家庭和学校用户的免费许可证 输入邮箱之后即可获得下载链接 安装非常简单 跟着提示进行即可 2 连接ubuntu 2 1 查看ubuntu的ip地址
  • Vue 父子组件通信v-model .sync修饰符

    一 v model简化父子组件通信 v model是什么 v model 是Vue框架的一种内置的API指令 本质是一种语法糖写法 它负责监听用户的输入事件以更新数据 并对一些极端场景进行一些特殊处理 v model实现表单的双向绑定
  • 算法:回文链表

    234 回文链表 给你一个单链表的头节点 head 请你判断该链表是否为回文链表 如果是 返回 true 否则 返回 false 示例 1 输入 head 1 2 2 1 输出 true 示例 2 输入 head 1 2 输出 false
  • ReID专栏(三) 注意力的应用

    前言 本文中提出了一种用于行人重识别的注意感知特征学习方法 该方法由一个部分注意分支 PAB 和一个整体注意分支 HAB 组成 并与基础再识别特征提取器进行了联合优化 由于这两个分支建立在主干网络上 因此没有为ReID特征提取引入额外的结构
  • 客户管理系统CRM表格版,含销售合同客户关系维护等功能

    客户管理系统CRM表格版 含销售合同客户关系维护等功能 系统由EXCEL开发 绿色安全 简单好用 送VBA宏插件编号 139653845009471设计师儿
  • 来自国际大厂Cloudflare的免费项目cloudflared

    在此之前 大家可以先去看看项目 https github com cloudflare cloudflared 事先声明 本人使用Ubuntu2204系统搭建 理论上适合Debian系Linux系统 Redhat系需要修改相关命令 其他系统
  • super和this关键字

    一 super关键字的应用场景 1 访问父类的成员变量 2 访问父类的构造函数 3 访问父类的方法 二 super关键字的使用 class Animal protected String name 注意 若限定符是private 子类无法使
  • 项目中都要掌握的BAPI之过账BAPI “ BAPI_ACC_DOCUMENT_POST”

    SAP FI 会计凭证过账 BAPI ACC DOCUMENT POST 该过账BAPI需要和模拟过账的BAPI BAPI ACC DOCUMENT CHECK 搭配使用 这样先执行模拟过账 成功了再执行真正的过账 这样就不会因为执行失败产
  • OpenGL加速渲染:显示列表glGenLists

    在OpenGL中 可能要用非常多的点 线 面来构成一幅图 若进行实时渲染 无疑对显示效率有非常大的影响 比如要画几百万个三角形 那么很可能旋转一下图片需要响应很久 为了加速渲染 可以将需要绘制的部分放在显示列表glGenLists中 每一个
  • git仓库完整迁移(代码,分支,提交记录)

    背景 我们公司使用Git进行版本控制 并使用gitlab搭建了公司的私有Git仓库 后期项目逐渐增多 项目老大为了统一项目权限管理 决定将不同项目统一放到一个Group中 一旦进行项目迁移 项目的git远端地址会发生变化 现在项目正在开发当
  • JavaScript单向链表结构

    JavaScript单向链表结构 h1 见控制台打印 h1