关于javascript:数据结构使用JS实现链表单链表

链表

链表是一种物理存储单元上非间断、非程序的存储构造,数据元素的逻辑程序是通过链表中的指针链接秩序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点能够在运行时动静生成。每个结点包含两个局部:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。【起源百度百科】

链表特点

  • 用一组任意的内存空间去存储数据元素(这里的内存空间能够是间断的,也能够是不间断的)
  • 每个节点(node)都由数据自身和一个指向后续节点的指针组成
  • 整个链表的存取必须从头指针开始,头指针指向第一个节点
  • 最初一个节点的指针指向空(NULL)

JS中并没有指针,上述节点的指针只是借用的C语言中的概念。

链表复杂度

工夫复杂度

Access Search Insertion Deletion
O(n) O(n) O(1) O(1)

空间复杂度

O(n)

单向链表的实现

链表中的几个次要操作

  • 初始化链表/节点
  • 头部插入节点
  • 搜寻/遍历节点
  • 删除节点

初始化链表中的节点

class LinkedListNode {
    constructor(value, next = null) {
        this.value = value;
        this.next = next; // 初始化为null
    }
}

初始化单向链表

class LinkedList {
    constructor() {
        // 初始空指针
        this.head = null;
    }
}

头部追加节点(append)

append(value) {
    // 新建节点
    const newNode = new LinkedListNode(value, this.head);
    // 将值赋予head 为了下次新建
    this.head = newNode;
 }

删除节点

delete(value) {
    // 如果不存在节点 return null
    if (!this.head) {
      return null;
    }
    // 如果删除的是第一个节点
    let deletedNode = null;

    // 如果删除的第一个元素
    while (this.head && this.head.value === value) {
      deletedNode = this.head;
      this.head = this.head.next;
    }
    // 非第一个节点,遍历查找
    let currentNode = this.head;
    if (currentNode !== null) {
      while (currentNode.next) {
        if (currentNode.next.value === value) {
          deletedNode = currentNode.next;
          currentNode.next = currentNode.next.next;
        } else {
          currentNode = currentNode.next;
        }
      }
    }
    return deletedNode;
  }

结语

做个简略总结,链表构造简略了解就是一个节点外面 蕴含以后value,以及下个next。 而后初始化就是一个head。同样的构造顺次去追加。了解的话会感觉很简略,当然链表远不止这些,还有双向链表,操作还有链表反转(reverse),删除(头,尾),转换数据结构等等。

下期见。

其余链接

上述示例代码仓库

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理