当前位置:首页 > JavaScript

js中如何实现单链表

2026-01-31 07:41:31JavaScript

单链表的基本概念

单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的头节点是访问整个链表的起点,尾节点的指针通常指向null

js中如何实现单链表

单链表的节点定义

在JavaScript中,可以通过类或构造函数定义链表节点。每个节点包含value(存储数据)和next(指向下一个节点的指针)。

js中如何实现单链表

class ListNode {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

单链表的实现

以下是单链表的完整实现,包含插入、删除、查找等基本操作。

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

  // 在链表尾部添加节点
  append(value) {
    const newNode = new ListNode(value);
    if (!this.head) {
      this.head = newNode;
    } else {
      let current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = newNode;
    }
    this.size++;
  }

  // 在链表头部添加节点
  prepend(value) {
    const newNode = new ListNode(value);
    newNode.next = this.head;
    this.head = newNode;
    this.size++;
  }

  // 在指定位置插入节点
  insertAt(value, index) {
    if (index < 0 || index > this.size) return false;
    if (index === 0) {
      this.prepend(value);
      return true;
    }
    const newNode = new ListNode(value);
    let current = this.head;
    let previous = null;
    let i = 0;
    while (i < index) {
      previous = current;
      current = current.next;
      i++;
    }
    newNode.next = current;
    previous.next = newNode;
    this.size++;
    return true;
  }

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

  // 查找节点值是否存在
  contains(value) {
    let current = this.head;
    while (current) {
      if (current.value === value) return true;
      current = current.next;
    }
    return false;
  }

  // 获取链表长度
  getSize() {
    return this.size;
  }

  // 打印链表
  print() {
    let current = this.head;
    const values = [];
    while (current) {
      values.push(current.value);
      current = current.next;
    }
    console.log(values.join(' -> '));
  }
}

使用示例

以下是单链表的简单使用示例:

const list = new LinkedList();
list.append(10); // 链表: 10
list.append(20); // 链表: 10 -> 20
list.prepend(5); // 链表: 5 -> 10 -> 20
list.insertAt(15, 2); // 链表: 5 -> 10 -> 15 -> 20
list.removeAt(1); // 链表: 5 -> 15 -> 20
console.log(list.contains(15)); // true
console.log(list.getSize()); // 3
list.print(); // 5 -> 15 -> 20

时间复杂度分析

  • 插入操作:头部插入(prepend)为O(1),尾部插入(append)和指定位置插入(insertAt)为O(n)。
  • 删除操作:头部删除为O(1),其他位置删除为O(n)。
  • 查找操作contains和按索引访问均为O(n)。

分享给朋友:

相关文章

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scale…

vue如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件: np…

java如何实现多线程

java如何实现多线程

实现多线程的方法 在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。此外,还可以使用ExecutorService等高级工具类来管理线程。 继承Thread类 通…

vue如何实现截图

vue如何实现截图

Vue 实现截图的方法 在 Vue 中实现截图功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 html2canvas 库 html2canvas 是一个流行的 JavaScript 库,…

vue框架如何实现

vue框架如何实现

Vue框架实现步骤 安装Vue.js 通过npm或CDN引入Vue.js,npm安装命令:npm install vue。CDN引入直接在HTML文件中添加Vue.js的script标签。 创建Vu…

vue如何实现webssh

vue如何实现webssh

使用Vue实现WebSSH WebSSH的实现需要结合前端Vue和后端服务,通常通过WebSocket协议与服务器进行实时通信。以下是具体实现方法: 安装必要依赖 在Vue项目中安装xterm.js…