JavaScript数据结构之链表的实现

JavaScript数据结构之链表的实现

什么是链表

链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点:

  • 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素)
  • 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索引直接访问任何元素)

链表的基本操作

链表的基本操作包括插入、删除、查找等。下面是对应操作的 JavaScript 实现。

创建链表节点

为了实现链表,首先需要创建一个节点类。

class Node {
  constructor(element) {
    this.element = element; // 当前节点元素
    this.next = null; // 下一个节点连接
  }
}

在链表末尾添加元素

在链表末尾添加元素时,需要先找到最后一个节点,然后将该节点的 next 指向新节点。

class LinkedList {
  constructor() {
    this.length = 0; // 链表长度
    this.head = null; // 头节点
  }
  append(element) {
    let node = new Node(element);
    let current;
    if (this.head == null) { // 链表为空
      this.head = node;
    } else { // 链表不为空,找到最后一个节点,并将其 next 指向新节点
      current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = node;
    }
    this.length++;
  }
}

下面是一个在链表末尾添加元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
console.log(list); // 链表长度为 3,头节点为 1,尾节点为 3。

在链表指定位置插入元素

在链表中插入元素时,需要找到被插入位置的前一个节点,然后将该节点的 next 指向新节点,新节点的 next 指向原来的节点。

class LinkedList {
  //...
  insert(position,element){
    if(position>=0&&position<=this.length){
      let node=new Node(element);
      let current=this.head,previous,index=0;
      if(position==0){ //插入到头节点
        node.next=current;
        this.head=node;
      }else{
        while(index++<position){ //找到要插入的位置,并找到其前一个节点
          previous=current;
          current=current.next;
        }
        previous.next=node;
        node.next=current;
      }
      this.length++;
      return true;
    }
    return false;
  }
}

下面是一个在链表指定位置插入元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.insert(1,4);
console.log(list); // 链表长度为 4,头节点为 1,尾节点为 3,第二个节点为 4。

删除链表中指定位置的元素

在删除链表中的元素时,需要找到该节点的前一个节点,然后将前一个节点的 next 指向该节点的下一个节点。

class LinkedList {
  //...
  removeAt(position){
    if(position>=0&&position<this.length){
      let current=this.head,previous,index=0;
      if(position===0){ //删除头节点
        this.head=current.next;
      }else{
        while(index++<position){ //找到要删除的位置,并找到其前一个节点
          previous=current;
          current=current.next;
        }
        previous.next=current.next;
      }
      this.length--;
      return current.element;
    }
    return null;
  }
}

下面是一个在链表中删除指定位置元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.removeAt(1);
console.log(list); // 链表长度为 2,头节点为 1,尾节点为 3。

总结

以上就是链表的实现及基本操作的介绍,相信通过以上的示例教程,你已经对链表有了更深层次的理解。需要注意的是,链表虽然能够提高插入和删除元素的效率,但由于无法随机访问任何元素,因此在某些需要快速访问元素的场合并不适用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数据结构之链表的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C++数据结构之红黑树的实现

    《C++数据结构之红黑树的实现》是一篇介绍红黑树实现的文章,通过本文,你可以了解到什么是红黑树以及如何实现红黑树。 什么是红黑树 红黑树是一种自平衡的二叉查找树,它具有良好的平衡性和查找性能。红黑树可以在O(log n)的时间内完成查找、插入和删除操作。 红黑树的一个重要性质是它的任何一个节点都有一个颜色(红色或黑色)属性。在插入、删除操作中,需要通过一定的…

    数据结构 2023年5月17日
    00
  • MySQL数据库体系架构详情

    MySQL数据库体系架构是MySQL数据库自身的发展和演变过程中逐渐形成的一个庞大的体系。这个体系由多个组件构成,包括连接器、查询缓存、解析器、优化器、执行器、存储引擎等多个部分,其中存储引擎是其中最具有代表性的组件之一。在这篇攻略中,我们将详细讲解MySQL数据库体系架构的各个部分,介绍它们各自的功能和作用。 连接器 MySQL的连接器负责与客户端建立连接…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之栈(动力节点Java学院整理)

    Java数据结构与算法之栈攻略 什么是栈? 栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。 栈的实现 栈的实现有两种方式: 基于数组实现的顺序栈(ArrayStack) 基于链表实现的链式栈(LinkedStack) 1. 基于数组实现的顺序栈 顺序栈的实现需要一个固定大小的数…

    数据结构 2023年5月17日
    00
  • C++实现LeetCode(211.添加和查找单词-数据结构设计)

    首先,我们需要先了解一下题目的要求和限制,以及具体的解题思路。 题目描述 设计一个支持添加、删除、查找单词的数据结构。添加和删除单词的操作需要支持普通词和通配符’.’。查找单词只支持普通词,不支持通配符’.’。所有单词都是非空的。 解题思路 这道题可以使用前缀树(Trie树)来实现。 首先,我们需要定义一个单词类,它包含两个字段:单词字符串和单词长度。然后,…

    数据结构 2023年5月17日
    00
  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

    数据结构 2023年5月17日
    00
  • golang优先级队列的实现全过程

    下面是关于”golang优先级队列的实现全过程”的详细讲解。 什么是优先级队列? 优先级队列是一种常用的数据结构,它可以帮我们按照一定规则(即优先级)将元素按照大小排序,并支持快速插入、删除和查询最大或最小的元素等操作。我们可以将优先级队列想象成一个具有优先级的、自动排序的队列,其中优先级高的元素(比如数字大的元素)排在前面,优先级低的元素(比如数字小的元素…

    数据结构 2023年5月17日
    00
  • Java性能优化之数据结构实例代码

    Java性能优化之数据结构实例代码攻略 本篇攻略主要介绍Java性能优化之数据结构实例代码的相关内容,包括数据结构的优化方法以及示例代码等。我们使用以下两个示例来说明性能优化的过程和方法。 示例1:字符串拼接 在Java中字符串拼接通常使用”+=”方式,但是在循环中频繁地使用该操作会导致性能问题。这时可以使用StringBuilder类的append()方法…

    数据结构 2023年5月17日
    00
  • 一些常见的字符串匹配算法

    作者:京东零售 李文涛 一、简介 1.1 Background 字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。 一个比较常见…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部