当前位置:首页 > JavaScript

js实现单向链表

2026-02-02 18:01:03JavaScript

单向链表的基本概念

单向链表是一种线性数据结构,由多个节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表中的元素在内存中不是连续存储的,而是通过指针链接起来。

实现单向链表的步骤

定义节点类

每个节点需要存储数据和指向下一个节点的引用。可以使用类或构造函数实现。

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

定义链表类

链表类需要管理节点的添加、删除和遍历等操作。

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

添加节点到链表末尾

add(data) {
  const node = new Node(data);
  if (!this.head) {
    this.head = node;
  } else {
    let current = this.head;
    while (current.next) {
      current = current.next;
    }
    current.next = node;
  }
  this.size++;
}

在指定位置插入节点

insertAt(data, index) {
  if (index < 0 || index > this.size) {
    return false;
  }
  const node = new Node(data);
  if (index === 0) {
    node.next = this.head;
    this.head = node;
  } else {
    let current = this.head;
    let prev;
    let i = 0;
    while (i < index) {
      prev = current;
      current = current.next;
      i++;
    }
    node.next = current;
    prev.next = node;
  }
  this.size++;
}

从链表中移除指定位置的节点

removeFrom(index) {
  if (index < 0 || index >= this.size) {
    return null;
  }
  let current = this.head;
  if (index === 0) {
    this.head = current.next;
  } else {
    let prev;
    let i = 0;
    while (i < index) {
      prev = current;
      current = current.next;
      i++;
    }
    prev.next = current.next;
  }
  this.size--;
  return current.data;
}

打印链表中的所有元素

print() {
  let current = this.head;
  let result = '';
  while (current) {
    result += current.data + ' -> ';
    current = current.next;
  }
  result += 'null';
  console.log(result);
}

完整代码示例

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

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

  add(data) {
    const node = new Node(data);
    if (!this.head) {
      this.head = node;
    } else {
      let current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = node;
    }
    this.size++;
  }

  insertAt(data, index) {
    if (index < 0 || index > this.size) {
      return false;
    }
    const node = new Node(data);
    if (index === 0) {
      node.next = this.head;
      this.head = node;
    } else {
      let current = this.head;
      let prev;
      let i = 0;
      while (i < index) {
        prev = current;
        current = current.next;
        i++;
      }
      node.next = current;
      prev.next = node;
    }
    this.size++;
  }

  removeFrom(index) {
    if (index < 0 || index >= this.size) {
      return null;
    }
    let current = this.head;
    if (index === 0) {
      this.head = current.next;
    } else {
      let prev;
      let i = 0;
      while (i < index) {
        prev = current;
        current = current.next;
        i++;
      }
      prev.next = current.next;
    }
    this.size--;
    return current.data;
  }

  print() {
    let current = this.head;
    let result = '';
    while (current) {
      result += current.data + ' -> ';
      current = current.next;
    }
    result += 'null';
    console.log(result);
  }
}

// 使用示例
const list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.print(); // 输出: 1 -> 2 -> 3 -> null
list.insertAt(4, 1);
list.print(); // 输出: 1 -> 4 -> 2 -> 3 -> null
list.removeFrom(2);
list.print(); // 输出: 1 -> 4 -> 3 -> null

单向链表的常见操作

查找节点

find(data) {
  let current = this.head;
  while (current) {
    if (current.data === data) {
      return current;
    }
    current = current.next;
  }
  return null;
}

判断链表是否为空

isEmpty() {
  return this.size === 0;
}

获取链表长度

getSize() {
  return this.size;
}

反转链表

reverse() {
  let current = this.head;
  let prev = null;
  let next = null;
  while (current) {
    next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }
  this.head = prev;
}

注意事项

  • 链表的操作需要注意边界条件,例如空链表或只有一个节点的链表。
  • 插入和删除操作需要正确处理指针的指向,避免内存泄漏或丢失节点。
  • 链表的遍历通常使用循环实现,注意循环的终止条件。

js实现单向链表

标签: 链表js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: funct…