js-学习链表

news2025/7/18 9:38:28

链表基础概念

链表和数组一样,可以用于存储一系列连续的元素。链表中的元素在内存中不必是连续的空间。链表的每一个元素有一个由一个存储元素本身的节点和一个指向下一个元素的引用组成(指针和连接)。

链表构成

数据+指针

链表优点

1.内存空间不是必须连续的,可以充分利用计算机的内存,实现灵活的内存动态管理;
2.链表不必在创建时就确定大小,并且大小可以无限的延伸下去;
3.链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高很多.

js中的链表

1.属于自定义数据结构;
2.可以存数字、字符串等等任意结构的数据;
在这里插入图片描述
在这里插入图片描述

上图展示的为单链表。

代码实现链表

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script>
        // 创建自定义对象
        // 1.声明类
        class LinkedList{
            // 2.创建构造函数
            constructor(){
                this.head=null;//头节点
                this.tail=null;//尾节点
                // 存放头尾,根据链表自身的特点,就相当于是存储了整个链表
            }
            //append追加节点(末尾添加)
            append(value){
                const newNode={value:value,next:null}
                if(this.tail){
                     this.tail.next=newNode;//新创建的节点和尾部节点进行数据关联
                }
                this.tail=newNode;//更新尾部值
                if(!this.head){
                    this.head=newNode;
                }
            }
            // 前置节点(头部添加)
            prepend(value){
                const newNode={value:value,next:this.head}; 
                this.head=newNode;
                if(!this.tail){
                    this.tail=newNode;
                }
            }
            // 删除节点 js垃圾回收
            delete(value){
                if(!this.head){
                    return;
                }
                    
                while(this.head&&this.head.value===value){
                    this.head=this.head.next;
                }
                let curNode=this.head;
                while(curNode.next){
                   if(curNode.next.value===value){
                       curNode.next=curNode.next.next;
                   }else{
                       curNode=curNode.next;
                   }
                }
                if(this.tail.value===value){
                    this.tail=curNode;
                }
            }
            // 查找节点
            find(value){
               if(!this.head){
                   console.log(null);
                   return null;
               } 
               let curNode=this.head;
               while(curNode){
                   if(curNode.value===value){
                       return curNode;
                   }
                       curNode=curNode.next;
               } 
               console.log(null);
               return null;
                   
            }
            // 插入节点,某个节点后边插入
            insertAfter(value,afterVaule){
                const existingNode=this.find(afterValue);
                if(existingNode){
                    const newNode={value:value,next:existingNode.next}
                    existingNode.next=newNode;
                }
            }
            
            //以数组方式输出节点
            toArray(){
                const elements=[];
                let curNode=this.head;
                while(curNode){
                    elements.push(curNode);
                    curNode=curNode.next;
                }
                return elements;
            }
        }
        // 创建对象,通过类里边声明的构造函数
        const linkedList1=new LinkedList();
        // 测试,能否执行节点添加
        linkedList1.append(1);
        linkedList1.append(1);
        linkedList1.append('aaa');
        linkedList1.append('aaa');
        linkedList1.append('reter');
        linkedList1.append('reter');
        linkedList1.append(2);
        linkedList1.append(true);
        linkedList1.prepend('one');
        console.log(linkedList1.toArray());
        // 删除元素
        linkedList1.delete('aaa');
        linkedList1.delete('reter');
        linkedList1.delete(1);
       // console.log(linkedList1);
       console.log(linkedList1.toArray());
       linkedList1.find(1);
       
        </script>
    </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实践分享:30分钟在电脑端运行小程序

预计实现效果&#xff1a;在电脑桌面端实现小程序运行 技术实现&#xff1a;小程序容器技术实现&#xff08;案例使用FinClip SDK) 技术的原理&#xff1a; 该 SDK 主要包括应用交互层、安全防护、网络通信控制和安全运行容器四个组件。 应用交互层&#xff1a;应用交互层是…

DBSCAN算法实现【超详细注释】

DBSCAN 算法步骤 设置每个对象为未访问 随机选择一个未访问的点ppp,标记ppp表示访问 如果p的半径为nnn的邻域中至少存在MinPts个对象 我们就创建一个新的簇&#xff0c;并将ppp加入ccc设N 是ppp邻域中对象的集合对在NNN中的每个点p′pp′ 如果p′pp′是未访问的 标记p′pp′…

Matlab:数值积分与符号计算

Matlab数值积分定积分的数值求解实现自适应积分算法梯形积分法累计梯形积分多重定积分的数值求解实现符号计算符号对象及其运算符号微积分符号极限符号导数求不定积分符号方程求解数值积分 数值积分&#xff0c;用于求定积分的近似值。在数值分析中&#xff0c;数值积分是计算定…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠&#xff0c;今天第一次在自己的项目中使用了下&#xff0c;感觉不是那么好&#xff0c;特别是SQL语句的支持度还是很欠缺&#xff0c;如limit等都不支持&#xff0c;还有特别单双引号都是需要特别注意的,下面是SQL S…

从0到1CTFer成长之路——1git(全网最详细)

1.1.2.1 git 泄露 (1) 常规git泄露 安装docker sudo apt-get update sudo apt-get install docker 安装容器 docker pull ubuntu:18.04 然后发现请求超时 我们需要阿里云的镜像加速器 我们按照要求配置文件 没有/etc/docker 就自己创建 sudo mkdir -p /etc/docker 然后写入…

Cookie与Session 以及给CBV添加装饰器

文章目录Cookie与Session1、Django操作cookie简单实现用户登录加入装饰器2、Django操作session设置session获取session过期时间清除sessionCBV添加装饰器Cookie与Session HTTP被设计为”⽆态”&#xff0c;也就是俗称“脸盲”。 这⼀次请求和下⼀次请求 之间没有任何状态保持&…

跨模态神经搜索实践VCED 环境准备

跨模态神经搜索实践 环境准备 本文基于WSL2及docker进行环境搭建 1. 安装和配置WSL2 Ubuntu发行版 1.1 安装WSL2 Ubuntu 相关安装命令&#xff1a; wsl --install&#xff1a;默认安装Ubuntu发行版wsl --list --online&#xff1a;查看可支持的发行版本wsl --install -d &…

如何将 wordfile 添加到 UltraEdit 或 UEStudio

UltraEdit 本身支持开箱即用的最常用编程和标记语言的语法突出显示。我们也有数百个其他语言的 wordfile&#xff0c;但是&#xff0c;很容易找到和添加您需要的语言&#xff01; 重要提示&#xff1a;此电源提示适用于运行 UltraEdit v15.00或 UEStudio v09.10及更高版本的用户…

Ubuntu18.04系统安装nginx

Ubuntu18.04系统安装nginx一、在线安装 Nginx二、离线安装 Nginx参考链接请确保以具有 sudo 权限的用户身份登录&#xff0c;并且您没有在端口 80 或 443 上运行 Apache 或任何其他 Web 服务器。 一、在线安装 Nginx 简介&#xff1a;Nginx (engine x) 是一个免费的&#xff0…

swift-类属性

了解属性之前&#xff0c;需要先了解前面的swift-类结构内容 - swift-类结构源码探寻 FieldDescriptor TargetClassDescriptor {var Flags: ContextDescriptorFlags // uint32var Parent: TargetRelativeContextPointer // Int32var Name: TargetRelativeDirectPointer // I…

Markdown还能这么玩?这款开源神器绝了!

Markdown是一款轻量级标记语言&#xff0c;由于它易读易写的特性&#xff0c;很多程序员用它来写项目文档。其实Markdown的功能不止于此&#xff0c;结合一些工具使用还可以用来做PPT&#xff0c;今天带大家使用Markdown来做一个PPT&#xff0c;看看到底有多炫酷&#xff01; S…

《springboot那些事》

注&#xff1a;static目录、主要用于存放非模板引擎渲染的资源。 ​ template目录&#xff0c;存放渲染引擎页面的资源。 一句话&#xff1a;用模板引擎的话&#xff0c;就放template目录、否则static目录。 一、使用thymeleaf 引入thymealeaf坐标 <dependency><…

22.11.15打卡 mysql学习笔记

学了DDL和DQL, 今天课太多, 没怎么学啊, 很烦躁, 还有3周要考试了 空格可以有一个或者多个 if not exists表示不存在则执行, 存在则不执行 方括号当中的都可 create database itcase; show databases;查看数据库 再次创建itcase数据库 加上if not exists就不会报错 字符集演示 …

DPDK LPM库(学习笔记)

1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配&#xff08;LPM&#xff09;表查找方法&#xff0c;该方法通常用于在IP转发应用程序中找到最佳路由匹配。 2 LPM API概述 LPM组件实例的主要配置参数是要支持的最大规则数。 LPM前缀由一对参数&#xff08;32位Key&…

React源码分析3-render阶段(穿插scheduler和reconciler)

本章将讲解 react 的核心阶段之一 —— render阶段&#xff0c;我们将探究以下部分内容的源码&#xff1a; 更新任务的触发更新任务的创建reconciler 过程同步和异步遍历及执行任务scheduler 是如何实现帧空闲时间调度任务以及中断任务的 触发更新 触发更新的方式主要有以下几…

Leetcode第21题:合并两个有序链表

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

面试官:你说说 Mysql 索引失效有哪些场景?

前言 SQL 写不好 加班少不了 日常工作中SQL 是必不可少的一项技术 但是很多人不会过多的去关注SQL问题。 一是数据量小&#xff0c;二是没有意识到索引的重要性。本文主要是整理 SQL失效场景&#xff0c;如果里面的细节你都知道&#xff0c;那你一定是学习能力比较好的人&am…

基于Docker的网络安全靶场搭建

背景介绍 在学习网络安全技术过程中,我们往往需要有一个自己的操作机与多个用来搭建环境的靶机,使用VM虚拟机模拟资源占用较大,成本高、局限性大且使用十分不便。 这时我们可以使用一台安装好Docker环境的linux虚拟机来完成桌面版操作机与WEB靶机的搭建与实验操作。 Docker…

Linux操作系统~进程替换,exec系列函数的使用

目录 1.概念/原理 &#xff08;1&#xff09;.替换原理 &#xff08;2&#xff09;.子进程调用execl执行程序替换&#xff0c;为什么父进程不受影响&#xff1f; &#xff08;3&#xff09;.exec*返回值 2.替换函数exec execl execv execlp execvp的&#xff08;execv…

Android Studio App开发之网络通信中使用POST方式调用HTTP接口实现应用更新功能(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、POST方式调用HTTP接口 POST方式把接口地址与请求报文分开&#xff0c;允许使用自定义的报文格式&#xff0c;由此扩大了该方式的应用场景。POST请求与GET请求主要有三处编码差异 1&#xff1a;在调用setRequestMethod方…