(三)前端javascript中的数据结构之链表上

在js中,没有为我们提供原生的数据结构支持的,但是在java中是有提供的。所以需要我们去模拟这种结构实现。
链表中最关键的一个元素,就是头节点,头节点不存储数据,指向第一个节点链表中几乎所有的操作都要从头结点开始。

链表的特点

1.链表中的元素在内存中并不是连续存储的,每个元素都有一个指针指向下一个元素
2.链表中的元素可以非常容易地插入和删除

封装类

//构造函数
function LinkList() {
  this.head = null;
  this.length = 0;
}
//辅助类,也叫内部类
function Node(data) {
  this.data = data;
  this.next = null;
}

增删改查

第一个方法,向链表末尾添加一个元素
在这里插入图片描述

LinkList.prototype.append = function (data) {
  //创建节点
  const node = new Node(data);
  //判断链表是否为空
  //如果为空,则将头节点指向新创建的节点
  if (this.length == 0) {
    this.head = node;
  } else {
    let current = this.head;
    //遍历链表,找到最后一个节点
    while (current.next) {
      current = current.next;  //这里就不是在不断地重新赋值current节点
    }
    current.next = node;
  }
  //链表长度加1
  this.length++;
};

2.查询元素
第二个方法,为了方测试,我们需要一个打印链表的方法

LinkList.prototype.print = function () {
  let current = this.head;
  let str = "";
  while (current) {
    str += current.data + " ";
    current = current.next;
  }
  return str;
};

测试一下

 const link = new LinkList();
 link.append('aaa');
 link.append('ddd');
 link.append('ccc');
 link.append('nba');
 console.log("print",link.print());   //print aaa ddd ccc nba 

3.删除一个元素,根据给点的position去删
在这里插入图片描述

//从链表中移除元素
LinkList.prototype.removeAt = function (position) {
  //越界判断
  if (position < 0 || position > this.length) return false;

  let current = this.head,
    previous,
    index = 0;

  //如果移除的是第一个元素
  if (position == 0) {
    //head指向下一个元素
    this.head = current.next;
  } else {
    while (index++ < position) {
      previous = current;
      current = current.next;
    }
    previous.next = current.next;
    console.log("🚀 ~ previous:", previous);
    console.log("🚀 ~ current:", current);
  }
  this.length--;
  return true;
};

根据给定的值删除链表中的元素

//根据元素值去删除
LinkList.prototype.remove = function (element) {
  let current = this.head,
    previous;
  let isNotFound = false;
  while (current) {
    if (current.data == element) {
      previous.next = current.next;
      isNotFound = true;
      this.length--;
      return true;
    }
    previous = current;
    current = current.next;
  }
  if (!isNotFound) {
    return -1;
  }
};

4.更新一个元素

//更新链表中的某个元素
LinkList.prototype.update = function (position, newData) {
  //越界判断
  if (position < 0 || position > this.length) return false;

  const element = this.getElement(position);
  element.data = newData;
  console.log("🚀 ~ element:", element);
  return true;
};

//获取链表中的某个位置的元素
LinkList.prototype.getElement = function (position) {
  //越界判断
  if (position < 0 || position > this.length) return false;
  let current = this.head,
    index = 0;

  while (index++ < position) {
    current = current.next;
  }
  return current;
};

5.查找一个元素

在这里插入图片描述

//获取指定位置的元素
LinkList.prototype.indexOf = function (element) {
  if (this.length == 0) return -1;

  let current = this.head,
    index = 0;

  while (current) {  //判断退出迭代的条件
    if (current.data == element) {
      return index;
    }
    current = current.next;
    index++;
  }
  return -1;
};

几个辅助方法

//为空
LinkList.prototype.isEmpty = function () {
  return this.length === 0;
};
LinkList.prototype.size = function () {
  return this.length;
};
LinkList.prototype.getHead = function () {
  return this.head;
};

测试所有的方法

	   link.insert(4,'maomao')
       console.log("print2",link.print());

       link.removeAt(4)
       console.log("print3",link.print());

       link.append('cba');
       console.log("print4",link.print());
       const index = link.indexOf('cba');
       const index2 = link.indexOf('eee');
       console.log("🚀 ~ index:", index)
       console.log("🚀 ~ index2:", index2)


       //查询链表中的元素
       const element = link.getElement(2);
       console.log("🚀 ~ element:", element)

       //更新元素
       const nElement = link.update(2,'tom')
       console.log("🚀 ~ nElement:", nElement)
       console.log("print5",link.print());
       

       //根据给定的元素删除
       const removeElement = link.remove('tom')
       console.log("🚀 ~ removeElement:", removeElement)
       console.log("🚀 ~ link:", link.print())

运行结果

在这里插入图片描述
这样,我们就熟悉了链表的相关操作增删改查,这只是单向链表,复杂的链表我们下次再单独分出来讲讲

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字流的秩

题目链接 数字流的秩 题目描述 注意点 x < 50000 解答思路 可以使用二叉搜索树存储出现的次数以及数字的出现次数&#xff0c;方便后续统计数字x的秩关键在于构建树的过程&#xff0c;如果树中已经有值为x的节点&#xff0c;需要将该节点对应的数字出现次数加1&#xf…

味全财税数字化实践分享,百望云助力实现数电票管理能力升级!

随着金税四期的启动&#xff0c;数电票全面落地应用&#xff0c;这不仅大幅提高了发票处理效率&#xff0c;更重塑了企业的财务管理流程&#xff0c;为企业财务数字化转型指明了新的方向。 杭州味全食品有限公司&#xff08;以下简称“味全”&#xff09;正在推进财税数字化建设…

(2024,稀疏 MoE,大量小专家,参数高效专家检索 PEER,product key 检索)混合百万专家

Mixture of A Million Experts 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 方法 3. 实验 0. 摘要 标准 Transformer 架构中的前馈&#xff08;feedforward&a…

轻松集成,高效变现:Flat Ads SDK助力开发者轻松跨越广告变现门槛

在当今的移动应用开发领域,广告变现是开发者们普遍关注的重要话题。如何在不影响用户体验的前提下,最大化地实现广告收益,成为了许多开发者面临的挑战。为此,Flat Ads SDK 应运而生,它以“轻松集成,合规守护,高效变现”为核心理念,帮助开发者轻松解决流量变现难题。 一、高效变…

tauri + vue3 如何实现在一个页面上局部加载外部网页?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

惟客数据Q2荣誉成绩单新鲜出炉

作为众多头部企业客户的数字化经营合作伙伴 WakeData惟客数据一直坚持以客户为中心&#xff0c;以数据驱动 致力于让数据智能商业落地更敏捷 凭借值得信赖的客户经营数字化和资源管理数字化实力 惟客数据在2024年第二季度斩获多项荣誉 1、 第一新声《2023年度中国高科技高…

从入门到精通:Shopee,lazada,temu自养号测评成本、步骤、技巧详解

测评对于卖家来说是一种成本低回报快的推广方式&#xff0c;可以减少高额的平台广告费用&#xff0c;因此是一种很好的辅助手段&#xff0c;对商品的曝光、流量、转化和权重等方面起到了很好的辅助作用 建议还是自己精养一批账号&#xff0c;账号在自己手里比较安全可控&#…

python中getattr/setattr/hasattr/delattr函数都是干什么的?

目录 1、getattr&#xff1a;动态获取属性 &#x1f50d; 1.1 动态获取属性 1.2 默认值处理技巧 1.3 实战案例&#xff1a;配置文件动态加载 2、setattr&#xff1a;动态设置属性 &#x1f6e0; 2.1 修改对象属性 2.2 新增属性场景 2.3 应用场景&#xff1a;类的动态配置…

Linux 命令历史、补全和正则表达式

1.命令历史就和windows的ctrlz一个概念&#xff0c;就是返回上一次的命令。 按下小键盘上下切换 ctrlc可以终止本次输入&#xff0c;进行下一次输入。 2.tab键可以自动补全&#xff08;有点鸡肋&#xff09; 3.正则表达式 类似于word的快速搜索&#xff0c;Linux也是用*和…

浅析C++引用

浅析C引用"&" ​ C中引入了一个新的语言特性——引用(&)&#xff0c;它表示某一对象的别名&#xff0c;对象与该对象的引用都是指向统一地址。那么我们就来看看关于引用的一些知识点吧&#x1f9d0; 特性 引用在定义时必须初始化一个变量可以有多个引用引…

zdppy_api+vue3+antd前后端分离开发,使用描述列表组件渲染用户详情信息

后端代码 import api import upload import time import amcomment import env import mcrud import amuserdetailsave_dir "uploads" env.load(".env") db mcrud.new_env()app api.Api(routes[*amcomment.get_routes(db),*amuserdetail.get_routes(db…

记一次微信小程序逆向

扫码领取网安教程 遇到瓶颈了&#xff0c;不知道该干什么&#xff0c;突然想到学校的小程序 闲来无事就看一看 抓包下来的数据是这样的&#xff0c;嗯&#xff0c;下机&#xff08;hhh 一、反编译程序 加密嘛&#xff0c;之前抓了看到是加密就放弃了&#xff0c;现在重新弄一…

轻松转换!两款AI工具让word秒变ppt!

想把Word文档一键生成PPT&#xff0c;过去有一个很常见的做法&#xff1a;先在Word文档中设置标题样式&#xff0c;通过标题样式来分隔每一部分&#xff0c;之后导出为PPT&#xff0c;就能得到一份PPT的雏形&#xff0c;但这种方法无法对PPT自动进行美化&#xff0c;即得到的只…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例&#xff1a; function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在&#xff0c;直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组&#xff0c;遍历数组每个元素if (Array.isArray(obj)) {obj…

【Python】一文向您详细介绍 np.inner()

【Python】一文向您详细介绍 np.inner() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;曾…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式&#xff0c;能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化&#xff0c;使其在不同时间…

【学术会议征稿】2024年第四届工商管理与数据科学学术会议(BADS 2024)

2024年第四届工商管理与数据科学学术会议(BADS 2024) 2024 4th International Conference on Business Administration and Data Science 2024年第四届工商管理与数据科学学术会议(BADS 2024)将于2024年10月25-27日在新疆喀什召开&#xff0c;由喀什大学支持本次会议。会议旨…

Mapboxgl 根据 AWS 地形的高程值制作等高线

更多精彩内容尽在dt.sim3d.cn&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 使用mapboxgl 3.0版本&#xff0c;根据 AWS 地形图块的高程值制作等高线&#xff0c;源码如下&#xff1a; <!DOCTYPE html> &…

OV证书签发一般要多久?

OV证书&#xff0c;即组织验证型SSL证书&#xff0c;的签发流程涉及多个阶段&#xff0c;其具体时间取决于多种因素。OV证书的签发一般需要1-3个工作日&#xff0c;这个过程可以分为以下几个阶段&#xff1a; 1、选择和购买证书&#xff1a; 用户需要在SSL证书服务商处选择合适…

AnaPico为众多工厂产线老化测试提供高效经济的微波解决方案

在电子设备的生产中&#xff0c;老化测试在整个使用寿命期间的可靠性和对声明参数的保证起着重要作用&#xff0c;尤其是在特殊应用&#xff08;国防和航天工业、电信、医药等&#xff09;方面。即使经过成功的参数和功能测试&#xff0c;在实际操作条件下使用时也有可能出现设…