📜  链表 javascript (1)

📅  最后修改于: 2023-12-03 15:12:32.400000             🧑  作者: Mango

链表 JavaScript

链表是一种常见的数据结构,它以节点的形式储存数据,每个节点指向下一个节点,最后一个节点则指向 null。JavaScript 中原本没有链表数据结构,但我们可以利用对象来构建链表。

建立链表
class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

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

  append(value) {
    const node = new Node(value);

    if (!this.head) {
      this.head = node;
      this.tail = node;
    } else {
      this.tail.next = node;
      this.tail = node;
    }

    this.length++;
  }

  insert(index, value) {
    if (index < 0 || index > this.length) {
      return false;
    }

    const node = new Node(value);

    if (index === 0) {
      node.next = this.head;
      this.head = node;
    } else if (index === this.length) {
      this.tail.next = node;
      this.tail = node;
    } else {
      let current = this.head;
      let previous = null;
      let i = 0;
      while (i < index) {
        previous = current;
        current = current.next;
        i++;
      }
      previous.next = node;
      node.next = current;
    }

    this.length++;
  }

  remove(index) {
    if (index < 0 || index >= this.length) {
      return false;
    }

    let current = this.head;

    if (index === 0) {
      this.head = current.next;
      if (this.length === 1) {
        this.tail = null;
      }
    } else if (index === this.length - 1) {
      while (current.next !== this.tail) {
        current = current.next;
      }
      current.next = null;
      this.tail = current;
    } else {
      let previous = null;
      let i = 0;
      while (i < index) {
        previous = current;
        current = current.next;
        i++;
      }
      previous.next = current.next;
    }

    this.length--;
    return current.value;
  }

  get(index) {
    if (index < 0 || index >= this.length) {
      return false;
    }

    let current = this.head;
    let i = 0;
    while (i < index) {
      current = current.next;
      i++;
    }
    return current.value;
  }

  toArray() {
    const array = [];
    let current = this.head;
    while (current) {
      array.push(current.value);
      current = current.next;
    }
    return array;
  }
}

以上是使用类建立链表的代码,我们可以通过 append() 方法向链表末尾加入节点,通过 insert() 方法在指定位置插入节点,通过 remove() 方法删除指定位置的节点,通过 get() 方法获取指定位置的节点值,以及通过 toArray() 方法获取链表中所有节点值组成的数组。

使用示例
const linkedList = new LinkedList();

linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
console.log(linkedList.toArray()); // [1, 2, 3]

linkedList.insert(1, 4);
console.log(linkedList.toArray()); // [1, 4, 2, 3]

linkedList.remove(0);
console.log(linkedList.toArray()); // [4, 2, 3]

console.log(linkedList.get(1)); // 2

以上是一个简单的链表操作示例。

性能

链表相比于数组,可以任意添加或删除任意位置的节点,但受制于指针,查找速度会比数组慢,因此在需要快速查找节点时,不宜使用链表。在需要频繁添加或删除节点时,链表往往比数组更优秀。

总结

链表是 JavaScript 中常见的数据结构,可以通过类来建立。在需要频繁添加或删除节点的场景中,链表更优秀。但在需要快速查找节点的场景中,数组更优秀。