(三)前端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;}//链表长度加1this.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.xdnf.cn/news/1475177.html

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

相关文章

安全防御(防火墙)

第二天&#xff1a; 1.恶意程序---一般会具有一下多个或则全部特点 1.非法性&#xff1a;你未经授权它自动运行或者自动下载的&#xff0c;这都属于非法的。那恶意程序一般它会具有这种特点&#xff0c; 2.隐蔽性&#xff1a;一般隐藏的会比较深&#xff0c;目的就是为了防止…

Proxifier代理的其他妙用方法(内网渗透、反溯源、小程序公众号)

目录 配置说明 1. 通过Proxifier进行内网渗透 2. 通过Proxifier将VM虚拟机代理 3. 通过Proxifier进行小程序抓包 4. 补充 文章截取处 配置说明 配置其他的之前,要新增一个代理规则,如下: 127.0.0.1; ::1 让它 Direct (直接连接,即不走任何代理)即可 说明: ::1是I…

下一代 CSS 框架:Mojo CSS

前言 Tailwind CSS 推出即受到广大开发者的欢迎&#xff0c;当前 Github star 数已达 77.8k。它是一个功能类优先&#xff08;utility-first&#xff09;的 CSS 框架&#xff0c;它提供了一系列功能类&#xff0c;让开发者可以在 HTML 中通过组合这些功能类&#xff08;原子类…

EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。 1、使用seq和mbbo的简单选择器 这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。 # 这个mbbo记录将选择将运行seq的哪段 record(mbbo, "CHOOSE") {field(VAL, "…

c#字符串常用方法

目录 1.字符串的处理常用方法 1.1 Format 1.2 IsNullOrEmpty和IsNullOrWhiteSpace 1.3 Equals 1.4 Contains 1.5 Length 1.6 Substring 1.7 IndexOf和LastIndexOf 1.8 ​​​​​​​StartsWith 和 EndsWith 1.9 ​​​​​​​Remove 1.10 ​​​​​​​Revserse…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

如何手工DIV一个小车:基于树莓派和总线舵机的智能小车实现

成品演示&#xff1a;bilibili - 悄悄的魔法书 代码仓库&#xff1a;github - flying forever 或者 gitee - 清风莫追 文章目录 1 引言1.1 课题背景1.2 课题意义1.3 课题目的 2 课题相关知识与开发环境3 课题的总体设计4 课题的详细设计与实现4.1 小车物理结构4.1.1 轮子4.1.2 …

2024年最新ComfyUI汉化及manager插件安装详解!

前言 在ComfyUI文生图详解中&#xff0c;学习过如果想要安装相应的模型&#xff0c;需要到模型资源网站&#xff08;抱抱脸、C站、魔塔、哩布等&#xff09;下载想要的模型&#xff0c;手动安装到ComfyUI安装目录下对应的目录中。 为了简化这个流程&#xff0c;我们需要安装Co…

如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?

文章目录 一、基本数据类型的去重二、多列数据的去重三、复杂数据结构的去重&#xff08;一&#xff09;数组类型的去重&#xff08;二&#xff09;JSON 类型的去重&#xff08;三&#xff09;结构体类型&#xff08;复合类型&#xff09;的去重 四、使用 GROUP BY 进行去重五、…

数据结构--堆,堆排序

1.树概念及结构 1.1树的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个 特殊的结…

自动高速开箱机:如何助力电商物流行业

在电商飞速发展的今天&#xff0c;物流行业也迎来了前所未有的挑战与机遇。为了满足消费者对快速、高效、安全的配送需求&#xff0c;各大电商平台和物流公司纷纷寻求技术革新&#xff0c;其中&#xff0c;自动高速开箱机凭借其独特的优势&#xff0c;在电商物流中崭露头角&…

vulnhub-Os-hackNos-3(包含多种靶机获取不了IP地址情况)

下载靶机 通过VMware搭建 网络问题是个关键点 我们点击开启虚拟机&#xff0c;到开机的页面我们回车选择第二个Ubuntu的高级选项 (如果出不来这个选择界面&#xff0c;开机时按下shift键) 进到高级选项&#xff0c;我们再次回车选择第二个进入Linux内核版本的恢复模式 回车后…

BaseServlet的封装

创建BaseServlet的必要性 如果不创建BaseServlet&#xff0c;现在我们只要实现一个功能&#xff0c;我们就需要创建一个servlet! 例如:用户模块(登录&#xff0c;注册&#xff0c;退出录&#xff0c;激活&#xff0c;发送邮件等等功能) 也就是说&#xff0c;我们必须要创建一…

Vue3使用ref绑定组件获取valueRef.value为null的解决

问题&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });输出&#xff1a; 查看绑定和定义都没有问题&#xff0c;还是获取不到 解决&#xff1a;使用getCur…

YOLOv5+DecoupleHead解耦头(YOLOx)

一、解耦头原理 在目标检测中,分类任务和回归任务之间的冲突是一个众所周知的问题。因此,用于分类和定位的解耦头被广泛应用于大多数一级和二级探测器。但是,由于YOLO系列的主干和特征金字塔(如FPN, PAN)不断演化,它们的检测头仍然是耦合的。 从下表可以看出,头耦合时端…

leetcode 1398 购买了产品A和产品B却没有购买产品C的顾客(postgresql)

需求 Customers 表&#xff1a; ---------------------------- | Column Name | Type | ---------------------------- | customer_id | int | | customer_name | varchar | ---------------------------- customer_id 是这张表的主键。 customer_name 是顾客的名称。 Order…

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示

【软件分享】我们为分类而生—eCognition

分类是各位小伙伴入门遥感需要做的一项基础的工作&#xff0c;在进行遥感影像中的地物进行分类和提取时&#xff0c;如何提高分类精度&#xff0c;常常令人头疼。今天小编带来此前接触过的一个工具&#xff0c;他的名字是—eCognition&#xff0c;感觉比ENVI好用&#xff0c;在…

gui创新点charts图表

import javax.swing.*; import java.awt.*;public class ComboChartExample extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 数据int[] values {100, 200, 150, 300, 250};int[] lineValues {120, 180, 160, 280, 230};Str…

掌上教务系统-计算机毕业设计源码84604

摘要 在数字化教育日益成为主流的今天&#xff0c;教务管理系统的智能化和便捷性显得尤为重要。为满足学校、教师、学生及家长对教务管理的高效需求&#xff0c;我们基于Spring Boot框架设计并实现了一款掌上教务系统。该系统不仅具备课程分类管理功能&#xff0c;使各类课程信…