Javascript链表模拟

在JavaScript中,我们可以使用对象和函数来创建链表结构。链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表主要有单向链表和双向链表两种类型,这里我们先介绍单向链表。

链表结构

链表的基本结构包括节点和链表本身。每个节点包含两个属性:data(存储数据)和next(指向下一个节点的指针)。链表本身则包含对链表头节点(head)的引用。

应用场景

  1. 数据库索引
    • 在数据库中,索引用于加快查询速度。
    • 链表索引结构的修改方便,尤其适合多次插入和删除操作的场景。
  2. 编辑器撤销操作
    • 编辑器通常有撤销操作,需要一种能够高效插入和删除数据的数据结构。
    • 链表支持O(1)时间内插入或删除某个元素,因此是编辑器中实现撤销操作的常用数据结构。
  3. 内存管理
    • 操作系统中的内存管理器使用链表来管理内存块(页框)。
    • 垃圾回收器也使用链表来管理内存池,以便快速查找空闲对象、回收内存等。
  4. 图形学
    • 在图形学中,遍历图像的像素的顺序很重要。
    • 链表的任意访问特性使得其在图形学中的应用非常广泛,如计算图像的梯度、滤波等。
  5. 缓存实现
    • 链表常被用于实现缓存,如客户端向服务器请求数据时,服务器将数据缓存在链表中。
    • 链表适合访问频率比较低的数据,可以将这些数据缓存到链表中,避免反复查找。
  6. 队列和栈
    • 链表可以用来实现队列和栈的数据结构。
    • 在实现广度优先搜索算法时需要用到队列,而深度优先搜索算法需要使用栈。
  7. 视频播放器
    • 在视频播放器中,将视频分为小的数据块,再用链表依次连接。
    • 这种方式可以减小播放卡顿的概率,提高播放视频的稳定性。
  8. 文件系统
    • 在文件系统中,对于大文件,采用分块存储的方法。
    • 每个块中都存下一份存储此块的地址信息,把它放在链表上,以便查找任意块的地址信息。

优点

  1. 动态内存分配:链表不需要事先估计容量,其占用的存储空间可以随时改变。
  2. 灵活性高:链表便于插入和删除操作,时间复杂度通常为O(1)(在已知插入或删除位置的情况下)。
  3. 空间利用率高:不会出现顺序表中的“闲置”和“溢出”现象。

缺点

  1. 访问元素效率低:链表中的元素在内存中并不是连续存放的,因此访问链表中的元素需要通过指针逐个访问,效率较低。
  2. 需要额外的空间存储指针:链表中的每个节点都需要一个额外的指针域来存储指向下一个节点的指针,这会增加内存空间的占用。
  3. 内存管理问题:链表容易出现内存泄漏和野指针问题,因此在使用时需要注意内存管理。

综上所述,链表在计算机科学的多个领域都有广泛应用,并展现出其独特的优缺点。在实际应用中,我们需要根据具体的需求和场景来选择使用链表还是其他数据结构。

 

主要方法

  1. append(data): 向链表末尾添加一个新节点。
  2. prepend(data): 向链表头部添加一个新节点。
  3. delete(key): 删除链表中第一个匹配指定值的节点。
  4. find(key): 查找链表中第一个匹配指定值的节点并返回该节点。
  5. printList(): 打印链表中的所有节点。

代码实现

以下是单向链表的完整实现:

class Node {  constructor(data) {  this.data = data;  this.next = null;  }  
}  class LinkedList {  constructor() {  this.head = null;  }  // 向链表末尾添加一个新节点  append(data) {  const newNode = new Node(data);  if (!this.head) {  this.head = newNode;  return;  }  let current = this.head;  while (current.next) {  current = current.next;  }  current.next = newNode;  }  // 向链表头部添加一个新节点  prepend(data) {  const newNode = new Node(data);  newNode.next = this.head;  this.head = newNode;  }  // 删除链表中第一个匹配指定值的节点  delete(key) {  if (!this.head) return null;  // 如果头节点就是要删除的节点  if (this.head.data === key) {  this.head = this.head.next;  return;  }  let current = this.head;  let previous = null;  // 遍历链表找到要删除的节点  while (current && current.data !== key) {  previous = current;  current = current.next;  }  // 如果没有找到要删除的节点  if (!current) return null;  // 断开节点间的链接  previous.next = current.next;  }  // 查找链表中第一个匹配指定值的节点并返回该节点  find(key) {  let current = this.head;  while (current && current.data !== key) {  current = current.next;  }  return current;  }  // 打印链表中的所有节点  printList() {  let current = this.head;  let result = [];  while (current) {  result.push(current.data);  current = current.next;  }  console.log(result.join(' -> '));  }  
}  // 示例用法  
const list = new LinkedList();  
list.append(1);  
list.append(2);  
list.append(3);  
list.prepend(0);  
list.printList(); // 输出: 0 -> 1 -> 2 -> 3  list.delete(2);  
list.printList(); // 输出: 0 -> 1 -> 3  const foundNode = list.find(3);  
if (foundNode) {  console.log(`Found node with data: ${foundNode.data}`); // 输出: Found node with data: 3  
} else {  console.log('Node not found');  
}

解释

  1. Node 类:表示链表中的节点,每个节点有 data 和 next 两个属性。
  2. LinkedList 类:表示链表,包含对链表头节点的引用以及操作链表的方法。
    • append(data):在链表末尾添加节点。
    • prepend(data):在链表头部添加节点。
    • delete(key):删除第一个匹配指定值的节点。
    • find(key):查找第一个匹配指定值的节点。
    • printList():打印链表中的所有节点。

链表作为一种常见的数据结构,在计算机科学的多个领域都有广泛应用,并展现出其独特的优缺点。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

LLM:reward-model-deberta-v3-large-v2模型结构

https://hf-mirror.com/OpenAssistant/reward-model-deberta-v3-large-v2是在做合成数据的质量打分时的奖励模型。 模型依托deberta-v3-large-v2编码模型,给定一个qa对,能够给出一个分数来衡量qa对的质量。没有公开训练细节,由于模型的输出层…

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印,只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…

基于微信小程序的电影交流平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

毕业设计选题:基于Hadoop的热点新闻分析系统的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 新闻类型管理 主题标签管理 热点新闻管理 新闻…

回归预测|时序预测|基于灰狼优化时域卷积TCN结合Transformer的多特征输入单输出的回归预测和多维时序预测Matlab程序

回归预测|时序预测|基于灰狼优化时域卷积TCN结合Transformer的多特征输入单输出的回归预测和多维时序预测Matlab程序 文章目录 一、基本原理一、基本概念二、原理和流程三、优势与应用四、总结 二、实验结果三、核心代码四、代码获取五、总结 回归预测|时序预测|基于灰狼优化时…

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …

ADC在STM32F1系列的使用详解

目录 1. ADC简介 2. 逐次逼近型ADC(ADC0809) 3. ADC框图(STM32) 4. ADC基本结构 5. 输入通道 6. 转换模式 6.1 单次转换 6.1.1 非扫描模式 6.1.2 扫描模式 6.2 连续转换 6.2.1 非扫描模式 6.2.2 扫描模式…

计算机网络—静态路由

1.0 网络拓扑结构 星型拓扑结构是一个中心,多个分节点。它结构简单,连接方便,管理和维护都相对容易,而且扩展性强。网络延迟时间较小,传输误差低。中心无故障,一般网络没问题。中心故障,网络就出…

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后,就想着分享给大家,最后一起学习,一起进步: 如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在…

汽车开发流程管理工具赋能安全与质量

随着数字化、人工智能、自动化系统及物联网技术的迅速发展,工程驱动型企业正面临重大转型挑战,亟需加速并深化其变革步伐。众多企业正试图通过采用基于模型的系统工程(MBSE)、产品线工程(PLE)、ASPICE、安全、网络安全、软件定义汽车、敏捷和精益开发实践…

漏洞挖掘JS构造新手向

前置思路文章 JS逆向混淆前端对抗 油猴JS逆向插件 JS加解密之mitmproxy工具联动Burp JS挖掘基础 伪协议 JavaScript伪协议是一种在浏览器中模拟网络请求的方法。它使用window.XMLHttpRequest对象或fetch()方法来模拟发送HTTP请求,而不是通过实际的网络请求来获…

最牛4G模组展示文件系统如何存储温湿度数据,有手就会还不牛?

有手就会的保姆级流程,展示大家常用的低功耗模组实用功能。 1.编写脚本 1.1 准备资料 780E开发板购买链接 780E开发板设计资料 LuatOS-Air780E-文件系统的使用-程序源码demo 合宙的TCP/UDP测试服务器 API使用介绍 780E开发板和DHT11 1.2 程序详解 第一步&a…

【C++ 算法进阶】算法提升五

先序遍历改二叉搜索树 &#xff08;二叉树的递归套路&#xff09; 题目 本题为LC原题目 题目如下 题目分析 本题为一道经典的二叉树递归套路题目 我们只需要想好一个递归函数 之后让左右节点分别执行即可 我们这里想到的递归函数为 TreeNode* process(vector<int>&a…

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…

【yolov8旋转框检测】微调yolov8-obb目标检测模型:数据集制作和训练

一、开发环境的准备 1.1 安装roLabelImg 参考【目标检测—旋转框标注】roLabelImg安装与使用文章的介绍&#xff0c;完成roLabelImg的安装。 1.2 Yolov8开发环境的准备 首先创建python虚拟环境&#xff0c;pip install ultralytics 来进行安装。 二、数据集准备 流程&…

FairGuard游戏加固全面适配纯血鸿蒙NEXT

2024年10月8日&#xff0c;华为正式宣布其原生鸿蒙操作系统 HarmonyOS NEXT 进入公测阶段&#xff0c;标志着其自有生态构建的重要里程碑。 作为游戏安全领域领先的第三方服务商&#xff0c;FairGuard游戏加固在早期就加入了鸿蒙生态的开发&#xff0c;基于多项独家技术与十余年…

数据库权限提升GetShell

数据库提权总结 - 随风kali - 博客园 (cnblogs.com) MySQL 漏洞利用与提权 | 国光 (sqlsec.com) sql注入getshell的几种方式 第99天&#xff1a;权限提升-数据库提权&口令获取&MYSQL&MSSQL&Oracle&MSF SQL注入拿shell的方式应该是通用的得到连接数据库…

未来AI的学习能力会达到怎样的水平?

​ 大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共2…

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…