使用js实现常见的数据结构---链表,队列,栈,树

news2024/9/20 22:57:21

:本文只作为数据结构的实现参考和个人理解

链表

链表是由多个节点(node)连接起来的,每个节点包含了一些存储的数据和指向下一个节点的指针,

  1. 链表:多个连续的节点构成,
  2. 节点:包含一串数据,以及下一个节点的数据

注意:链表是由顺序的数据集结构,访问链表只能从头到尾的访问

 

// 定义一个节点
class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

// 定义一个链表
class LinkedList {
  constructor() {
    this.first = null;//初始化头节点
  }
  // 添加节点
  addNode(data) {
    const node = new Node(data);
    if (this.first === null) {
      this.first = node;
    } else {
      let current = this.first;
      while (current.next) {//后续节点存在
        current = current.next;//移动到下一个节点
      }
      current.next = node;
    }
  }
  // 删除节点
  removeNode(data) {
    if (this.first === null) {
      return;
    }
    if (this.first.data === data) {
      this.first = this.first.next;
      return;
    }
    let current = this.first;
    while (current.next) {
      if (current.next.data === data) {
        current.next = current.next.next;
        return;
      }
      current = current.next;
    }
  }
  // 遍历链表
  getList() {
    let current = this.first;
    let arr = []
    while (current) {
      arr.push(current.data);
      current = current.next;
    }
    return arr.reduce((a, b) => a + '->' + b, '');
  }
}

const list = new LinkedList();
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.addNode(4);
list.addNode(5);
console.log(list.getList());
list.removeNode(3);
console.log(list.getList());
console.log(list);
console.log(list.first.next);

队列

先进先出的数据结构:每次只能从队列的尾部添加数据,从队列的头部访问数据,

  1. 一头放数据,一头拿数据,不可直接访问中间的数据
// 创建一个队列
class Queue {
  #value
  constructor(){
    this.#value = []
  }
  get value(){
    return this.#value[this.#value.length - 1];//返回最后一个元素
  }
  set value(val){
    this.#value.splice(0, 0, val);//头部添加元素
  }
  delValue(){
    this.#value.pop()//删除最后一个元素
  }
  getQueue(){
    return this.#value.toReversed().reduce((a,b)=> a+'->'+b, '')
  }
}

// 先进先出
const queue = new Queue()
queue.value = 1
queue.value = 2
queue.value = 3
queue.value = 4
queue.value = 5
queue.value = 6
queue.value = 7
console.log(queue.getQueue())
console.log(queue.value) 
queue.delValue()
queue.delValue()
console.log(queue.value) 

 栈

后进先出的数据结构:只有一个出入口,数据的增减都在尾部

  1. 只能在链式数据的一端进行访问数据和修改数据
// 后进先出
class Stack {
  #value
  constructor() {
    this.#value = []
  }
  get value() {
    return this.#value[this.#value.length - 1]
  }
  set value(val) {
    this.#value.push(val)
  }

}

const stack = new Stack()
stack.value = 1
stack.value = 2
stack.value = 3
console.log(stack.value)

 

树是一个二维结构,一颗树从根节点出发,连接着多个子节点,每个子节点又连接着子孙节点,循环往复就组成了一棵树;

注意:在树中子节点只能指向子孙节点不能指向父节点,根节点只有一个,他是所有节点的父节点,不能被任何节点指向

  1. 根节点:每个数的根节点只能有一个(最顶层的节点)
  2. 叶节点:没有子节点的节点(最底层的节点)

 

class TreeNode {
  constructor(data) {
    this.data = data;
    this.children = null;
  }
  add(data) {// 向节点添加子节点
    if (this.children === null) {// 如果无字节点添加节点之前,设置属性为空数组
      this.children = [];
    }
    this.children.push(new TreeNode(data));
  }
  remove(data) {// 移除节点的子节点
    if (this.children === null) {
      return false;
    }
    for (let i = 0; i < this.children.length; i++) {
      if (this.children[i].data === data) {
        this.children.splice(i, 1);
        return true;
      }
    }
    return false;
  }
  // 层序遍历树
  // 记录层数, 每层节点放入一个数组
  log() {
    const result = []; // 存放结果的容器
    let level = 0; // 记录层数,默认为顶层
    result[level] = [String(level), this.data]; // 将根节点放入第一层,string表示层级
    level++;// 下一层

    function loop(node, level) {
      if (!node.children) {// 没有子节点退出递归
        return;
      }
      if (!result[level]) {// 如果没有创建数组,则创建
        result[level] = [String(level)];
      }

      node.children.map(item => {
        result[level].push(item.data);// 将结果放置再本层
        loop(item, level + 1);// 递归调用下一层

      })

    }
    loop(this, level);
    console.log(result);
  }
}

const tree = new TreeNode(1);
tree.add(2);
tree.add(3);
tree.children[0].add(4);
tree.children[0].add(5);
tree.children[1].add(6);
tree.children[1].add(7);
tree.children[0].children[0].add(8);
tree.log();

console.log(tree)

总结 

        通过js的class的功能,可以很清晰的实现这些数据结构,本质上看数据结构表示的是按照一定的关系顺序存放数据,每个数据的单位都是节点,节点包含了一个单位数据(任意大小)和下一个节点的地址(引用),这里是使用js对象属性的方式来实现的;

        一维的数据结构中,链表是最基本的数据结构,它按顺序连接了多个节点,通过头节点就可以获取到整个链表数据,其他的数据结构(队列,栈)都类似链表结构的变式

        树是二维的数据结构,它的关系是一对多,一个节点指向了多个节点,同时树是开放的,一颗树是没有环状结构的(子节点不会引用父节点),一旦出现环状结构,就变成了图(封闭的二维数据结构)

这些基本结构的映射关系: 点(节点)--- 线(一维结构) --- 面 (二维结构)

补充:

        和数组的关系:数组也是一种数据结构,但它是连续的空间(连续的变量集合),而链表这样的结构它的数据是分散的(各处的变量集合)

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

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

相关文章

spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j

1.简介 OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后&#xff0c;Swagger规范正式更名为OpenAPI规范&#xff0c;并且根据OpenAPI规范的版本号进行了更新。因此&#xff0c;Swagger 3.0对应的就是OpenAPI 3.0版本&#xff0c;它是Swagger在OpenAPI阶段推出的一个…

大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

试过可道云teamOS的权限管理,才知道团队协作可以这么顺

在快节奏的工作环境中&#xff0c;团队协作的顺畅与否往往决定了项目的成败。作为团队中的一员&#xff0c;我深知权限管理在团队协作中的重要性。 我们的团队在协作过程中总是被权限问题所困扰。文件共享、资料访问、任务分配……每一个环节都需要小心翼翼地处理权限设置&…

学术研讨 | 区块链与隐私计算领域专用硬件研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心主办&#xff0c;长安链开源社区支持的“区块链与隐私计算领域专用硬件研讨会”顺利召开&#xff0c;会议围绕基于区块链与隐私计算的生成式AI上链、硬件加速、软硬协同等主题展开讨论&#xff0c;来自复旦大学、清华大学、北京…

主题公园- 海豹主题式风格餐厅设计【AIGC应用】

业务背景&#xff1a;海洋馆针对细分客群增设一个打卡主题点位&#xff0c;以海豹主题式餐厅为打卡卖点&#xff0c;效果参见海豹主题式风格。 AIGC概念图制作平台&#xff1a;&#xff08;可灵&#xff09; https://klingai.kuaishou.com/ 关键词&#xff1a; 海豹主题餐厅…

机器学习 | 回归算法原理——随机梯度下降法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的多重回归继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享随机梯度下降法这一回归算法原理。本章的回归算法原理还是基于《基于广告费预测点击量》项目&#xff0c;欢迎大家交流学习&#xff01;…

Python 教程(二):语法与数据结构

目录 前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码 运算符list、set和dict 数据结构 区别1. list&#xff08;列表&#xff09;2. set&#xff08;集合&#xff09;3. dict&#xff08;字典&#xff09; 总结 前言 Python 是一种计算机编…

HarmonyOS实现跨语言交互(Node-API)

Node-API简介 通过Native接口&#xff0c;实现两种代码的交互。 是在Node.js提供的Node-API基础上扩展而来&#xff0c;但与Node.js中的Node-API不完全兼容。本质就是提供了对C/C代码的使用接口&#xff0c;使得两种代码共同工作。规范I/O、CPU密集型、OS底层等能力。 应用场景…

Python | Leetcode Python题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; class Solution:def nthUglyNumber(self, n: int) -> int:dp [0] * (n 1)dp[1] 1p2 p3 p5 1for i in range(2, n 1):num2, num3, num5 dp[p2] * 2, dp[p3] * 3, dp[p5] * 5dp[i] min(num2, num3, num5)if dp[i] num2:p2 1if …

pytest的安装和介绍和 Exit Code 含义

pytest 准备工作&#xff08;在cmd里&#xff09;&#xff1a; 1安装 pip install -U pytest2验证安装 pytest --version # 会展示当前已安装版本3其他的 显示可用的内置函数参数 pytest --fixtures通过命令行查看帮助信息及配置文件选项 pytest --help一、pytets框架中的…

Windows安装go语言开发环境

一、下载安装包 安装包下载地址 下载完毕后双击进行安装。 查看是否安装成功&#xff1a; go version #查看go版本 go env #查看go环境变量正常显示则安装完成。 二、安装vscode 一般开发go语言项目使用vscode工具&#xff1a; 下载地址 下载完毕后双击进行安装。 三…

FPGA开发——D触发器的设计

1、概述 锁存器和触发器有时组合在一起&#xff0c;因为它们都可以在其输出上存储一位&#xff08;1或0&#xff09;。与锁存器相比&#xff0c;触发器是需要时钟信号&#xff08;Clk&#xff09;的同步电路。D 触发器仅在时钟从0 到 1&#xff08;上升沿&#xff09;或 1 到 …

python—NumPy基础(3)

文章目录 算术函数算术函数的使用算术函数中out参数的使用mod()函数的使用 统计函数power()函数的使用median ()函数的使用mean ()函数的使用函数的使用 其他常用函数tile()和repeat()函数的使用roll()函数的使用resize()函数的使用replace()和put()函数的使savetxt()和loadtxt…

可视挖耳勺的正确使用方法:四款宝藏单品,等你来挑选!

现在很多人都关注自己的个护健康&#xff0c;越来越多人开始使用可视挖耳勺。传统挖耳勺很有可以清洁不干净&#xff0c;导致耳耵聍堆积在耳道深处&#xff0c;引起耳朵发炎甚至感染。可视挖耳勺可以在看见耳道内部的情况下精准挖出耳耵聍&#xff0c;一定程度上安全又有效。但…

git命令使用详细介绍

1 环境配置 设置的信息会保存在~/.gitconfig文件中 查看配置信息 git config --list git config user.name设置用户信息 git config --global user.name "有勇气的牛排" git config --global user.email “1809296387qq.com”2 获取Git仓库 2.1 本地初始化一个仓…

Apache压测工具ab(Apache Bench)工具的下载安装和使用示例

场景 Jmeter进行http接口压力测试&#xff1a; Jmeter进行http接口压力测试_接口压测两万量-CSDN博客 上面讲压测工具Jmeter的使用&#xff0c;下面介绍另外一个ab(Apache Bench)压测工具的使用。 apache bench apache bench是apache自带的压力测试工具。 ab不仅可以对ap…

HTML开发笔记:3.图形化开发软件与模版网站

一、Google Web Designer 下载网址&#xff1a;webdesigner.withgoogle.com&#xff08;得挂梯子&#xff09; 可以编辑文字 可以插入图片&#xff0c;快捷键是ctrlshiftI 右侧“大纲”属性中可以调节大小 可以点击右上角在浏览器中预览效果&#xff1a; 二、模版网站 https://…

前端学习3——自学习梳理

1.学习一下盒子模型(盒子就是元素&#xff0c;标签) 盒子模型又分为4种&#xff1a;块级&#xff0c;内联级&#xff0c;内联块级&#xff0c;弹性盒子 (弹性盒子续在下一节) 2.元素的结构 1.盒子模型 <!DOCTYPE html> <html lang"en"> <head>&l…

《Java初阶数据结构》----5.<二叉树的概念及使用>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

mysql定时备份

为什么写这篇文章 最近项目里面需要定时备份mysql的数据&#xff0c;网上找了下&#xff0c;找到了一些比较好的解决方案。但是发现有几个地方与自己不匹配&#xff0c;我期望有如下 备份过程不能锁表&#xff0c;网上很多都是会锁表备份定时任务无法执行&#xff0c;但是手动…