新闻中心

j*ascript中的数据结构有哪些_如何实现链表或二叉树

2025-12-15
浏览次数:
返回列表
J*aScript无内置链表、队列、栈、二叉树等结构,需用对象/数组/函数模拟;常见需手写的是单向/双向链表、BST、堆、图;如单向链表用ListNode和LinkedList类实现头尾插入与查找,BST通过递归插入和中序遍历支持有序操作。

javascript中的数据结构有哪些_如何实现链表或二叉树

J*aScript 中没有内置的链表、队列、栈、二叉树等经典数据结构,但可以用对象、数组和函数灵活模拟。核心在于理解结构逻辑,再用原生语法实现。

常见可手写的数据结构类型

虽然 JS 提供了 Array(可当栈/队列用)、Map(哈希表)、Set(去重集合),但以下结构需手动实现:

  • 单向/双向链表(插入删除 O(1),查找 O(n))
  • 二叉搜索树(BST,支持有序遍历和对数级查找)
  • 堆(最小堆/最大堆,用于优先队列)
  • 图(邻接表或邻接矩阵表示)

如何实现一个单向链表

每个节点包含 value 和指向下一个节点的 next 引用。重点是维护头节点(head)和操作逻辑。

示例代码:

Waifulabs Waifulabs

一键生成动漫二次元头像和插图

Waifulabs 317 查看详情 Waifulabs
class ListNode {
  constructor(val, next = null) {
    this.val = val;
    this.next = next;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
  }

  // 头部插入
  prepend(val) {
    this.head = new ListNode(val, this.head);
  }

  // 尾部插入
  append(val) {
    if (!this.head) {
      this.head = new ListNode(val);
      return;
    }
    let node = this.head;
    while (node.next) node = node.next;
    node.next = new ListNode(val);
  }

  // 查找值
  find(val) {
    let node = this.head;
    while (node && node.val !== val) node = node.next;
    return node;
  }
}

如何实现一个二叉搜索树(BST)

BST 要求:左子树所有节点值

示例代码:

class TreeNode {
  constructor(val, left = null, right = null) {
    this.val = val;
    this.left = left;
    this.right = right;
  }
}

class BST {
  constructor() {
    this.root = null;
  }

  insert(val) {
    this.root = this._insertNode(this.root, val);
  }

  _insertNode(node, val) {
    if (!node) return new TreeNode(val);
    if (val < node.val) {
      node.left = this._insertNode(node.left, val);
    } else if (val > node.val) {
      node.right = this._insertNode(node.right, val);
    }
    return node; // 重复值不插入
  }

  // 中序遍历:左→根→右 → 输出升序数组
  inorder() {
    const result = [];
    function tr*erse(node) {
      if (!node) return;
      tr*erse(node.left);
      result.push(node.val);
      tr*erse(node.right);
    }
    tr*erse(this.root);
    return result;
  }
}

实际使用建议

不要为了“炫技”在业务中硬套手写结构。多数场景下:

  • Array + push/pop 模拟栈;shift/push 模拟队列(注意 shift 是 O(n),高频队列可用双端队列思路优化)
  • 需要排序+查范围?考虑 Array.sort() + 二分查找(如用 lowerBound)更简单可靠
  • 真有性能瓶颈(如大量增删+有序遍历),再引入 BST 或用现成库如 tinyqueue(最小堆)

基本上就这些。手写结构的价值不在“用”,而在理解底层逻辑——比如为什么 BST 插入平均 O(log n),而链表删除前驱节点却很麻烦。练一两次,比背十遍 API 更管用。

以上就是j*ascript中的数据结构有哪些_如何实现链表或二叉树的详细内容,更多请关注其它相关文章!


# 二叉树  # 娱乐网站优化  # 南宁网站优化设计软件  # seo推广专员工作好做吗  # 食品市场营销推广方案  # 山东整站网站优化  # 青铜峡网络推广营销方案  # 公众号营销如何推广  # 柳江区网络营销推广公司  # 湛江网站优化搜索  # 阜宁英文网站建设费用  # 多线程  # 自定义  # 子树  # javascript  # 有哪些  # 遍历  # 递归  # 如何实现  # 链表  # 数据结构  # 为什么  # 性能瓶颈  #   # app  # node  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3官方可用镜像 Archive of Our Own网页版最新入口  如何在 Windows 11 中启动游戏手柄设置  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  在Runstone环境中高效处理TasteDive API的JSON数据  利用5118提升短视频内容效果_5118短视频关键词优化方法  b站怎么删除评论_b站评论管理与删除操作  AO3最新可访问网址 Archive of Our Own官方在线入口  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  QQ官网正版登录链接 QQ在线登录入口最新  J*a中实现Go语言select通道多路复用机制  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  必由学官方登录入口 必由学教师学生账号快速访问  期待已久:小米17 Ultra、小米首款NAS本月登场  深入理解与实现最大堆的Heapify过程:常见错误与修正  在VS Code中配置和运行Dart程序的完整步骤  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Win10双系统截图高效法 截屏快捷键速记【技巧】  AO3官方在线访问地址 Archive of Our Own最新镜像合集  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  必由学官网入口 必由学教师登录入口  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  C++如何比较两个字符串_C++ string compare函数与操作符对比  Kafka Streams中基于消息头条件过滤消息的实现指南  顺丰国际快递查询 国际件官方查询入口  我的世界官方游戏入口 我的世界官网平台直达链接  在WordPress中通过REST API获取BasicAuth保护的远程文章  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  天眼查企业查询官网入口 天眼查官方网页版查询  word中如何让数字纵向排列_Word数字纵向排列方法  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Promise错误处理:在catch后终止链式then执行的策略  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  uc浏览器网页版入口 uc浏览器网页版最新网址  单射、满射与双射的关系 一文理清所有逻辑  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  PHP 枚举:根据字符串获取枚举案例的策略与实现  c++项目目录结构应该如何组织_c++工程化项目结构规范  J*a应用程序首次运行自动创建文件与目录的最佳实践  如何在Promise链中有效终止错误处理后的执行  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明 

搜索