首页 > 其他分享 >写一个单向链数据结构的 js 实现并标注复杂度

写一个单向链数据结构的 js 实现并标注复杂度

时间:2024-12-08 09:21:42浏览次数:11  
标签:index head 复杂度 js next current 数据结构 data size

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

class LinkedList {
  constructor() {
    this.head = null;
    this.size = 0;  // Keep track of the list size
  }

  // Add a new node to the end of the list (append)
  // Time Complexity: O(n) - because in the worst case (no tail pointer), we need to traverse the whole list.
  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.size++;
  }


  // Add a new node to the beginning of the list (prepend)
  // Time Complexity: O(1) - constant time operation
  prepend(data) {
    const newNode = new Node(data);
    newNode.next = this.head;
    this.head = newNode;
    this.size++;
  }

  // Insert a new node at a specific index
  // Time Complexity: O(n) - in the worst case (inserting at the end or if index is out of bounds), we need to traverse the whole list.
  insertAt(data, index) {
    if (index < 0 || index > this.size) {
      return "Invalid Index"; // Or throw an error, depending on your needs
    }

    if (index === 0) {
      this.prepend(data);
      return;
    }

    const newNode = new Node(data);
    let current = this.head;
    let previous = null;
    let count = 0;

    while (count < index) {
      previous = current;
      current = current.next;
      count++;
    }

    newNode.next = current;
    previous.next = newNode;
    this.size++;
  }

  // Remove a node at a specific index
  // Time Complexity: O(n) - in the worst case (removing the last element), we need to traverse almost the whole list.
  removeAt(index) {
    if (index < 0 || index >= this.size) {
      return "Invalid Index"; // Or throw an error
    }

    if (index === 0) {
      this.head = this.head.next;
      this.size--;
      return;
    }

    let current = this.head;
    let previous = null;
    let count = 0;

    while (count < index) {
      previous = current;
      current = current.next;
      count++;
    }

    previous.next = current.next;
    this.size--;
  }


  // Get the value at a specific index
  // Time Complexity: O(n) - in the worst case (getting the last element), we need to traverse the whole list.
  get(index) {
    if (index < 0 || index >= this.size) {
      return "Invalid Index"; // Or throw an error
    }

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


  // Print the linked list
  // Time Complexity: O(n) - we need to traverse the whole list to print each element.
  printList() {
    let current = this.head;
    let str = "";
    while (current) {
      str += current.data + " ";
      current = current.next;
    }
    console.log(str);
  }

    // Get the size of the linked list
    // Time Complexity: O(1) - size is stored as a property
    getSize() {
        return this.size;
    }

}



// Example usage:
const ll = new LinkedList();
ll.append(10);
ll.prepend(5);
ll.append(15);
ll.insertAt(12, 2); // Insert 12 at index 2
ll.removeAt(1);    // Remove the element at index 1
ll.printList(); // Output: 5 12 15

标签:index,head,复杂度,js,next,current,数据结构,data,size
From: https://www.cnblogs.com/ai888/p/18593041

相关文章

  • js中的undefined和 ReferenceError: xxx is not defined 有什么区别?
    在JavaScript中,undefined和ReferenceError:xxxisnotdefined虽然都表示变量在某种程度上不可用,但它们代表了不同的情况:undefined:表示一个变量已被声明,但尚未赋值。它是一个JavaScript的内置值,表示变量存在于作用域中,但它没有被赋予任何具体的值。letmyVariable;......
  • 【数据结构】哈夫曼树
    哈夫曼树路径长度:从树中一个结点到另一个结点之间的分支构成这两个节点之间的路径,路径上的分支数目称为路径长度树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL=∑......
  • 学习threejs,实现配合使用WebWorker
    ......
  • Js逆向学习过程
    Js逆向-字段追踪本文章是记录本人学习Js逆向的相关学习过程,后续会持续更新,欢迎大家点评指正。点点数据基本情况在进行浏览器头部签名堆栈分析时,我们首先需要了解一些基本情况:页面地址:https://app.diandian.com/定位接口:https://api.diandian.com/pc/app/v1/user/favor......
  • 数据结构 (31)插入类排序
    前言     数据结构中的插入类排序是一种简单直观的排序算法,其核心思想是通过构建有序序列,将未排序的数据逐个插入到已排序的序列中,直到所有元素都排序完毕。一、基本思想    插入排序的基本思想是将数组分为已排序和未排序两部分,初始时,已排序部分只包含一......
  • 数据结构 (32)交换类排序
    前言     交换排序是一类基于比较和交换元素位置的排序算法。其核心思想是通过两两比较待排元素的关键字(或称为key值),若发现与排序要求相逆(即逆序),则交换这两个元素的位置,直到所有元素都排序完毕。一、冒泡排序(BubbleSort)基本思想:通过反复比较相邻的元素,根据......
  • JAVA开源毕业设计 课程作业管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T023,文末自助获取源码\color{red}{T023,文末自助获取源码}......
  • JAVA开源毕业设计 社区团购系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T024,文末自助获取源码\color{red}{T024,文末自助获取源码}......
  • node.js毕设高校宿舍报修管理系统 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于高校宿舍报修管理系统的研究,现有研究主要以高校后勤管理系统中的部分功能涉及为主,专门针对高校宿舍报修管理系统全面功能与流程优化的研究较少。在......
  • node.js毕设基于Java的房屋租赁系统的设计与实现 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于房屋租赁系统的研究,现有研究主要以系统的基本功能实现为主,如用户、房东、房屋信息等模块的构建。在国内外,许多地区已经广泛应用各类房屋租赁管理系......