当前位置:首页 > JavaScript

js如何实现链表

2026-04-07 13:30:50JavaScript

链表基础概念

链表是一种线性数据结构,由节点(Node)组成,每个节点包含数据域和指针域。指针域存储下一个节点的地址,最后一个节点的指针指向null

实现单链表

单链表是最简单的链表形式,每个节点只有一个指向下一个节点的指针。

js如何实现链表

定义节点类

class Node {
  constructor(data) {
    this.data = data; // 数据域
    this.next = null; // 指针域
  }
}

链表类实现

js如何实现链表

class LinkedList {
  constructor() {
    this.head = null; // 链表头节点
    this.length = 0;  // 链表长度
  }

  // 添加节点到链表末尾
  append(data) {
    const newNode = new Node(data);
    if (!this.head) {
      this.head = newNode;
    } else {
      let current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = newNode;
    }
    this.length++;
  }

  // 插入节点到指定位置
  insert(position, data) {
    if (position < 0 || position > this.length) return false;
    const newNode = new Node(data);
    if (position === 0) {
      newNode.next = this.head;
      this.head = newNode;
    } else {
      let current = this.head;
      let index = 0;
      let previous = null;
      while (index++ < position) {
        previous = current;
        current = current.next;
      }
      newNode.next = current;
      previous.next = newNode;
    }
    this.length++;
    return true;
  }

  // 删除指定位置的节点
  removeAt(position) {
    if (position < 0 || position >= this.length) return null;
    let current = this.head;
    if (position === 0) {
      this.head = current.next;
    } else {
      let index = 0;
      let previous = null;
      while (index++ < position) {
        previous = current;
        current = current.next;
      }
      previous.next = current.next;
    }
    this.length--;
    return current.data;
  }

  // 查找节点位置
  indexOf(data) {
    let current = this.head;
    let index = 0;
    while (current) {
      if (current.data === data) {
        return index;
      }
      current = current.next;
      index++;
    }
    return -1;
  }

  // 链表转字符串
  toString() {
    let current = this.head;
    let str = '';
    while (current) {
      str += current.data + (current.next ? ' -> ' : '');
      current = current.next;
    }
    return str;
  }
}

使用示例

const list = new LinkedList();
list.append(10);
list.append(20);
list.insert(1, 15);
console.log(list.toString()); // 输出: "10 -> 15 -> 20"
list.removeAt(1);
console.log(list.toString()); // 输出: "10 -> 20"

双向链表实现

双向链表的节点包含前驱和后继指针,实现方式类似单链表,但需额外处理prev指针。

双向链表节点类

class DoublyNode extends Node {
  constructor(data) {
    super(data);
    this.prev = null; // 前驱指针
  }
}

双向链表类实现 需在单链表基础上重写appendinsertremoveAt等方法,处理prev指针的指向逻辑。

分享给朋友:

相关文章

vue如何实现mvvm

vue如何实现mvvm

Vue 的 MVVM 实现原理 Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)模式。其核心在于将数据模型(Model)与视图(View)通过 ViewMod…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

vue如何实现递归

vue如何实现递归

递归组件的实现方法 在Vue中实现递归组件通常用于渲染树形结构或嵌套数据。核心思路是组件在其模板中调用自身,但需注意终止条件以避免无限循环。 定义递归组件 组件需设置name选项,才能在模板中调用自…

vue如何实现分业

vue如何实现分业

Vue 实现分页的方法 在 Vue 中实现分页功能通常需要结合后端接口或前端数据处理。以下是几种常见的实现方式: 使用第三方分页组件 许多 UI 库提供了现成的分页组件,例如 Element UI…

vue如何实现删除

vue如何实现删除

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个关键步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,为每个项目添加删除按钮。确保数据存储在 Vue 的 data…

vue如何实现筛选

vue如何实现筛选

在Vue中实现筛选功能 Vue提供了多种方式实现数据筛选,可以根据需求选择合适的方法。以下是几种常见的实现方式: 使用计算属性实现筛选 计算属性是Vue中实现筛选功能的推荐方式,它会自动缓存结果,…