当前位置:首页 > 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如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <d…

vue如何实现select

vue如何实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过原生 HTML <select> 元素或使用第三方 UI 库(如 Element UI、Ant Des…

vue如何实现渲染

vue如何实现渲染

Vue 渲染实现方法 Vue 的渲染主要通过模板编译、虚拟 DOM 和响应式系统实现。以下是具体实现方式: 模板编译 Vue 模板会被编译成渲染函数。模板可以写在 .vue 文件的 <temp…

vue如何实现绑定

vue如何实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现动态绑定 HTML 属性或组件 prop。基本语法为 v-bind:属性名="表达式",简写为 :属性名="表达式"。例如绑定 class 或 sty…

vue 如何实现多选

vue 如何实现多选

Vue 实现多选的几种方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。当用户勾选多个选项时,选中的值会自动添加到数组中。 <temp…

vue如何实现cron

vue如何实现cron

Vue 中实现 Cron 表达式功能 在 Vue 项目中实现 Cron 表达式功能通常需要借助第三方库或自定义组件。以下是几种常见方法: 使用 vue-cron 组件 vue-cron 是一个专门为…