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

news2024/11/13 11:17:36

在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.coloradmin.cn/o/1906742.html

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

相关文章

提高交易决策质量,Anzo Capital昂首资本只需两个交易策略

要想提高交易决策质量&#xff0c;其实很简单&#xff0c;Anzo Capital昂首资本只需两个交易策略&#xff0c;结合价格行为和VSA(成交量与价格分析)就可以达成我们的目的。首先&#xff0c;理解这两个概念&#xff1a; 1. 价格行为&#xff1a;价格行为是市场价格变动的方式&a…

js逆向研究【响应结果解密思路与案例实战】

什么是响应结果加密 我们在爬虫过程中&#xff0c;抓包之后&#xff0c;针对内容关键词搜索无法定位到数据接口&#xff0c;并在响应的接口内发现有编码/不可读的长字符串等&#xff0c;我们可以判定其为响应结果加密。 如何针对将响应结果还原为可读的数据 如果响应结果有特…

高中毕业生,学历低可以考PMP吗?

PMP认证与学历无关&#xff0c;但需要注意报考条件&#xff1a; 学历&#xff1a;满23周岁/高中毕业5年以上/大专毕业3年以上&#xff0c;满足其中一个即可&#xff1b; 证明&#xff1a;必须有35学时&#xff08;PDU&#xff09;证明&#xff0c;即项目管理培训或学习证明&a…

Java | Leetcode Java题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n nums.length;Map<Long, Long> map new HashMap<Long, Long>();long w (long) t 1;for (int i 0; i < n; i) {long i…

6、Redis系统-数据结构-04-Hash

四、哈希表&#xff08;Hashtable&#xff09; 哈希表是一种高效的键值对数据结构&#xff0c;通过散列函数将键映射到表中的位置&#xff0c;实现快速的插入、删除和查找操作。Redis 广泛使用哈希表来实现 Hash 对象和数据库的键值存储。以下将从结构设计、哈希冲突与链式哈希…

【学术会议征稿】第五届计算机工程与智能控制学术会议(ICCEIC 2024)

第五届计算机工程与智能控制学术会议&#xff08;ICCEIC 2024) 2024 5th International Conference on Computer Engineering and Intelligent Control 第五届计算机工程与智能控制学术会议&#xff08;ICCEIC 2024&#xff09;将于2024年10月18日至22日在广州举办&#xff0…

04-Haproxy搭建Web群集

理论讲解 Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS 和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂:Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff…

tiff图片怎么转jpg?值得介绍的四种tiff转jpg方法

tiff图片怎么转jpg&#xff1f;jpg使用有损压缩技术&#xff0c;可以显著减小文件大小。这使得jpg文件更适合在网络上传输和在设备上存储。而且&#xff0c;PG格式被各种浏览器、图像查看器、编辑软件以及社交媒体平台广泛支持&#xff0c;使得分享和查看图片更加方便。如果需要…

tableau条形图绘制 - 2

tableau条形图绘制 1. 条形图绘制-11.1 创建工作表1.2 修改工作表名称1.3 条形图绘制1.4 显示标签1.5 行列转换 2. 条形图绘制-22.1 新建工作表2.2 修改工作表名称2.3 条形图绘制2.4 价格度量选平均值2.5 标签度量选平均值2.6 升序&#xff0c;整个视图显示2.7 行列转换 3. 堆积…

叹为观止|四款让人赞不绝口的优质软件,越用越上瘾

不说闲话直接上狠货&#xff0c;下面神仙软件&#xff0c;都值得使用。 Smart Defrag 说起电脑运行慢或者抽风&#xff0c;磁盘碎片就是让电脑变得又卡又不稳定的元凶之一。 不过Smart Defrag就算是新手小白也能操作&#xff0c;它里面藏着一个超强的碎片整理引擎&#xff0…

DevEco Studio No device 无法识别 usb 设备 - 鸿蒙

DevEco Studio IDE 版本与手机系统版本升级后出现了 USB 连接设备后 IDE 无法识别 no device 的情况出现; 解决办法 首先,确定当前 DevEco Studio 的 IDE 版本与移动设备的大版本保持一致; 其次,在版本相互匹配的情况下,查看移动设备是否开启了开发者模式与 USB 调试,具体步骤…

短视频文学剧本:成都柏煜文化传媒有限公司

短视频文学剧本&#xff0c;是创作者对现实世界的一次微缩重构。在这个被精心设计的空间里&#xff0c;时间被压缩&#xff0c;空间被浓缩&#xff0c;但每一个细节都经过精心雕琢&#xff0c;力求在有限的时间内展现出最大的信息量与情感深度。成都柏煜文化传媒有限公司从人物…

南方SouthMap:测绘世界的利器

在现代测绘领域&#xff0c;南方SouthMap软件无疑是一款不可或缺的工具。作为一名长期使用这款软件的用户&#xff0c;我深深感受到它在工作中的重要性和便利性。SouthMap不仅仅是一款软件&#xff0c;更是测绘工作者的得力助手&#xff0c;帮助我们在复杂的地理信息数据处理中…

9.pwn 栈溢出原理

栈溢出简介 函数中的存储在栈中的局部变量数组边界检查不严格发生越界写&#xff0c;造成用户输入覆盖到缓冲区外的数据内容&#xff0c; 由于栈中同时存在着与函数调用参数的相关信息&#xff0c;栈溢出可以导致控制流劫持 基础栈溢出(hello world in pwn) 多数情况下我们需…

掌握【Python异常处理】:打造健壮代码的现代编程指南

目录 ​编辑 1. 什么是异常&#xff1f; 知识点 示例 小李的理解 2. 常见的内置异常类型 知识点 示例 小李的理解 3. 异常机制的意义 知识点 示例 小李的理解 4. 如何处理异常 知识点 示例 小李的理解 5. 抛出异常 知识点 示例 小李的理解 6. Python内置…

linux学习week2+3

linux学习 九.linux磁盘分区、挂载 3.磁盘情况查询 命令&#xff1a;df -h 注意&#xff1a;使用率到80%以上就要清理了 查询指定目录的磁盘占用情况&#xff1a;du -d 目录 其它参数&#xff1a; -s&#xff1a;指定目录占用大小汇总 -h&#xff1a;带计量单位 -a&#xff…

直播平台集成美颜工具详解:视频美颜SDK开发指南

本篇文章&#xff0c;小编将详细介绍如何在直播平台中集成美颜工具&#xff0c;帮助开发者更好地理解视频美颜SDK的开发过程。 一、美颜工具的作用和原理 1.1 美颜工具的作用 美颜工具主要用于提升直播视频的画面质量&#xff0c;让主播和观众在镜头前看起来更加美观。这些功…

解决Windows server 2022环境下,远程桌面连接仅允许两个用户同时登录问题,亲测有效!

文章目录 问题描述解决服务器远程桌面限制&#xff1a;第一步&#xff1a;给服务器开启远程访问权限解决服务器远程桌面限制&#xff1a;第一种方案&#xff1a;临时开启多用户远程桌面限制&#xff08;120天&#xff09;解决服务器远程桌面限制&#xff1a;第二种方案&#xf…

视频图文理解关联技术与创业团队(二)

上一篇&#xff1a;google gemini1.5 flash视频图文理解能力初探&#xff08;一&#xff09;提到了gemini 1.5 flash 可以对视频进行理解以及分析&#xff0c;但是整体在检索任务上效果不佳。 这几天参加了人工智能大会 网上收集&#xff0c;看一看有相似能力的一些技术点、创…

越来越多用户和商家选择小程序商城的原因是什么?小程序商城怎么搭建?

得益于小程序的便捷性&#xff0c;越来越多的用户选择在小程序商城购物&#xff0c;越来越多的商家也开始搭建自己的小程序商城。背后原因是什么呢&#xff1f;小程序商城怎么搭建&#xff1f; 用户为何青睐小程序商城&#xff1f; 1、便捷性 小程序商城无需下载安装&#xff…