【js刷题:数据结构链表之设计链表】

news2024/9/24 23:25:15

设计链表

  • 一、题目
  • 二、题解

一、题目

在这里插入图片描述

二、题解

// 定义节点类,每个节点都有一个值和一个指向下一个节点的引用
class LinkNode{
    constructor(val,next){ // 构造函数,接收节点值和下一个节点的引用
        this.val=val       // 节点的值
        this.next=next     // 指向下一个节点的引用
    }
}

// 定义链表类
var MyLinkedList = function() {
    this.size=0            // 链表的大小(节点数量)
    this.head=null         // 链表的头节点
    this.tail=null         // 链表的尾节点
};

// 获取链表中第index个节点的值
MyLinkedList.prototype.get = function(index) {
     if(index < 0 || index >= this.size) return -1; // 如果索引无效,返回-1
    // 获取当前节点并返回其值
    return this.getNode(index).val;
};

// 在链表头部添加一个节点
MyLinkedList.prototype.addAtHead = function(val) {
    const node = new LinkNode(val, this.head); // 创建新节点,其下一个节点是当前的头节点
    this.head = node;                           // 更新头节点为新节点
    this.size++;                                // 链表大小加1
    if(!this.tail) {                            // 如果链表为空,则新节点也是尾节点
        this.tail = node;
    }
};

// 在链表尾部添加一个节点
MyLinkedList.prototype.addAtTail = function(val) {
     const node = new LinkNode(val, null);      // 创建新节点,下一个节点为null
    this.size++;                                // 链表大小加1
    if(this.tail) {                             // 如果链表不为空
        this.tail.next = node;                  // 当前尾节点的下一个节点是新节点
        this.tail = node;                       // 更新尾节点为新节点
        return;                                 // 结束函数执行
    }
    this.tail = node;                           // 如果链表为空,则新节点既是头节点也是尾节点
    this.head = node;
};

// 获取链表中第index个节点
MyLinkedList.prototype.getNode = function(index) {
    if(index < 0 || index >= this.size) return null; // 如果索引无效,返回null
    // 创建虚拟头节点,其下一个节点是实际的头节点
    let cur = new LinkNode(0, this.head);
    // 移动到第index个节点
    while(index-- >= 0) {
        cur = cur.next;
    }
    return cur; // 返回目标节点
};

// 在链表中的第index个位置添加一个节点
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index>this.size) return;                   // 如果索引超出链表大小,不执行任何操作
    if(index===this.size){                        // 如果索引等于链表大小,在尾部添加节点
        this.addAtTail(val)
        return;
    }
    if(index<=0){                                 // 如果索引小于等于0,在头部添加节点
        this.addAtHead(val)
        return;
    }
    const node = this.getNode(index-1)            // 获取第index-1个节点
    node.next=new LinkNode(val,node.next)         // 在其后面添加新节点
    this.size++;                                  // 链表大小加1
};

// 删除链表中第index个位置的节点
MyLinkedList.prototype.deleteAtIndex = function(index) {
     if(index < 0 || index >= this.size) return; // 如果索引无效,不执行任何操作
    if(index === 0) {                             // 如果是删除头节点
        this.head = this.head.next;               // 更新头节点为下一个节点
        // 如果删除的这个节点同时是尾节点,更新尾节点为null
        if(index === this.size - 1){
            this.tail = this.head
        }
        this.size--;                              // 链表大小减1
        return;                                   // 结束函数执行
    }
    // 获取目标节点的上一个节点
    const node = this.getNode(index - 1);        
    node.next = node.next.next;                   // 跳过要删除的节点,即删除操作
    // 如果删除的是尾节点,更新尾节点
    if(index === this.size - 1) {
        this.tail = node;
    }
    this.size--;                                  // 链表大小减1
};

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

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

相关文章

班组建设门道多,企业管理咨询公司助你轻松上手!

班组作为企业的基本单元&#xff0c;其建设水平直接关系到企业的整体运营效率和员工的工作积极性。那么&#xff0c;如何有效地进行班组建设&#xff1f;班组建设又有啥门道呢&#xff1f;本文&#xff0c;深圳天行健企业管理咨询公司将从多个角度探讨这一问题&#xff0c;以期…

牛客热题:二叉树的最大深度

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;二叉树的最大深度题目链接方法一…

算法day06

第一题 1658. 将 x 减到 0 的最小操作数 如题上述&#xff1a; 本题原来的意思给定一个数字x&#xff0c;从数组的左边或者右边 使用x减去数组中的数字&#xff0c;直到减去最后一个数字为0时&#xff0c;返回最小的操作次数&#xff1b;如果最终减去的数组中的数字之后不能得…

ElastiCache Serverless for Redis应用场景和性能成本分析

一. 前言 传统基于实例节点的 Redis 缓存架构中&#xff0c;扩展性是一个重要影响因素。在很多场景中&#xff0c;例如广告投放、电商交易、游戏对战&#xff0c;流量是经常变化的。无论是主从还是集群模式&#xff0c;当大流量进入时&#xff0c;Redis 处理能力达到上限&…

【保姆级介绍下运维】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

爱校对新功能上线:领导人讲话和职务排序校对

我们很高兴地宣布&#xff0c;爱校对网站正式推出两项新功能&#xff1a;领导人讲话校对和领导人职务排序校对。这些新功能旨在帮助用户更准确地引用和整理领导人讲话内容&#xff0c;以及正确排列领导人的职务顺序。 领导人讲话校对 在撰写报告或文章时&#xff0c;引用领导…

数据结构与算法===优先队列

文章目录 前言一、优先队列二、应用场景三、代码实现总结 前言 之前写过很多数据结构与算法相关的了&#xff0c;今天看一个新的数据结构&#xff0c;优先队列。优先队列类似队列&#xff0c;却又优先于队列&#xff0c;是堆实现的。接下来详细看看。 一、优先队列 优先队列一…

Java面试八股之为什么要使用克隆

Java中为什么要使用克隆&#xff1f;怎么实现对象的克隆&#xff1f;深拷贝和浅拷贝的区别是什么 在Java中使用克隆主要有以下几个原因&#xff1a; 创建对象副本&#xff1a;克隆可以快速创建一个与原对象状态完全相同的副本&#xff0c;无需手动逐一复制每个属性。这种情况…

网络故障快速定位的秘诀 - 基于 AnaTraf 全流量回溯分析

网络故障是每个 IT 从业者都深有体会的头疼问题。当网络出现异常时,如何快速定位故障原因,恢复网络正常运行,是考验运维能力的关键所在。借助 AnaTraf 网络流量分析仪的全流量回溯分析功能,您可以轻松应对各种复杂的网络问题,实现快速故障定位。 1. 网络故障分析的痛点 网络故…

STM32_HAL_TIM_通用计时器_实现计时

项目思路 1使用定时器计数每秒一次 2使用一个变量记录定时器响应多少次 3使用UART将记录的次数发出 1STM32Cude设置 1配置时钟源 2打开UART 3打开TIM2 3.1界面介绍 3.2选项介绍 Slave Mode&#xff08;从模式&#xff09;&#xff1a;当设备被设置为从模式时&#xff0c…

flowable工作流设置审批人为指定角色+部门的实现方式

一、绘制流程图页面配置 1、指定固定审批角色组织的实现 如上图红框部分&#xff0c;需要修改此处为需求对应。比如此时红框不支持指定某个部门下的指定角色这种组合判断的审批人。则需要修改页面变成选完角色同时也选择上部门统一生成一个group标识。 修改完后&#xff0c;生…

海思Hi3065H 200MHz 高性能 RISCV32 A² MCU

这是一款海思自研的RISCV32内核的高性能实时控制专用MCU&#xff0c; 具有高性能、高集成度、高可靠性、易开发的特点&#xff0c;同时还有嵌入式AI能力。 CPU • RISC-V200MHzFPU 存储 • Up to 152KB Code Flash • 8KB Data Flash • 16KB SRAM 个人认为这是MCU梯队非常…

MES系统在电线电缆行业生产上的应用

MES系统在线缆行业的应用可以带来多重价值&#xff0c;包括提高生产效率、降低生产成本、提高产品质量、优化库存管理、改善生产环境和提高企业竞争力等方面。因此&#xff0c;在电线电缆行业中广泛应用MES系统可以提高企业的经济效益和社会效益&#xff0c;推动企业发展和行业…

Windows本地部署直播录屏利器Bililive-go并实现远程添加直播间录屏

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏…

5 特征筛选

5 特征筛选 学习目标 掌握单特征分析的衡量指标知道 IV,PSI等指标含义知道多特征筛选的常用方法掌握Boruta,VIF,RFE,L1等特征筛选的使用方法1 单特征分析 什么是好特征?从几个角度衡量:覆盖度,区分度,相关性,稳定性 覆盖度 采集类,授权类,第三方数据在使用前都会分析…

java AOP环绕通知记录操作日志

一.创建数据库日志表 CREATE TABLE uc_system_log (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,user_code varchar(64) DEFAULT NULL COMMENT 用户编码,user_name varchar(128) DEFAULT NULL COMMENT 用户名称,is_login tinyint(4) NOT NULL DEFAULT 0 COMMENT 是…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.3 指数加权平均数&#xff08;Exponential…

Java-数据库连接(JDBC小白教学)

&#xff01;文章最后附有完整代码&#xff01; 目录 &#x1f516;JDBC概述 &#x1f516;JDBC连接数据库 &#x1f516;添加数据&#xff08;insert&#xff09; &#x1f516;修改数据&#xff08;Update&#xff09; &#x1f516;删除数据&#xff08;delete&#x…

边缘计算教学实训解决方案

一、引言 随着物联网、5G通信技术的快速发展&#xff0c;边缘计算作为云计算的延伸和补充&#xff0c;正逐渐成为支撑智能物联网、实时数据分析等领域的重要技术。唯众旨在为职业院校设计一套全面的边缘计算教学实训体系&#xff0c;通过理论与实践相结合的方式&#xff0c;培…

深度剖析MyBatis的二级缓存

二级缓存的原理 MyBatis 二级缓存的原理是什么&#xff1f; 二级缓存的原理和一级缓存一样&#xff0c;第一次查询会将数据放到 缓存 中&#xff0c;然后第二次查询直接去缓存读取。但是一级缓存是基于 SqlSession 的&#xff0c;二级缓存是基于 mapper 的 namespace 的。也就是…