【JavaScript】LeetCode:707设计链表

news2024/9/23 11:21:32

文章目录

  • 题目内容
  • 题目分析
    • (1) 获取第n个节点的值
    • (2) 头部插入节点
    • (3) 尾部插入节点
    • (4) 第n个节点前插入节点
    • (5) 删除第n个节点
  • 完整代码

题目内容

在这里插入图片描述

题目分析

  • 添加哨兵节点dummy。
  • 在第n个节点前插入节点时,应该找到第n - 1个节点(即前一个节点),才能完成插入操作。
  • 在删除第n个节点时,应该找到第n - 1个节点(即前一个节点),才能完成删除操作。

(1) 获取第n个节点的值

  • cur指向头节点(第0个节点是头节点),cur向后移动n次后,指向第n个节点。
MyLinkedList.prototype.get = function(index) {
    if(index < 0 || index > this.size - 1){
        return -1;
    }
    var cur = this.dummy.next;
    while(index){
        cur = cur.next;
        index--;
    }
    return cur.val;
};

(2) 头部插入节点

  • 新建待插入节点headNode。
  • ① headNode节点指向头节点。
  • ② 哨兵节点指向headNode节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtHead = function(val) {
    var headNode = new ListNode(val);
    headNode.next = this.dummy.next;
    this.dummy.next = headNode;
    this.size++;
};

(3) 尾部插入节点

  • 新建待插入节点tailNode,新建节点自动指向null。
  • cur指向哨兵节点,cur一直向后移动,直到找到尾节点。
  • ① 原尾节点指向tailNode节点,tailNode节点成为新尾节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtTail = function(val) {
    var tailNode = new ListNode(val);
    var cur = this.dummy;
    while(cur.next != null){
        cur = cur.next;
    }
    cur.next = tailNode;
    this.size++;
};

(4) 第n个节点前插入节点

  • 新建待插入节点newNode。
  • cur指向哨兵节点,cur向后移动n次后,指向第n - 1个节点。
  • ① newNode节点指向第n个节点。
  • ② 第n - 1个节点指向newNode节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index < 0 || index > this.size){
        return;
    }
    var newNode = new ListNode(val);
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    newNode.next = cur.next;
    cur.next = newNode;
    this.size++;
};

(5) 删除第n个节点

  • cur指向哨兵节点,cur向后移动n次后,指向第n - 1个节点。
  • ① 第n - 1个节点指向第n + 1个节点(第n个节点的下一个节点)。
  • 链表长度-1。
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index < 0 || index > this.size - 1) {
        return;
    }
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    cur.next = cur.next.next;
    this.size--;    
};

完整代码

function ListNode(val, next) {
    this.val = (val===undefined ? 0 : val);
    this.next = (next===undefined ? null : next);
}

var MyLinkedList = function() {
    this.size = 0;
    this.dummy = new ListNode();
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function(index) {
    if(index < 0 || index > this.size - 1){
        return -1;
    }
    var cur = this.dummy.next;
    while(index){
        cur = cur.next;
        index--;
    }
    return cur.val;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    var headNode = new ListNode(val);
    headNode.next = this.dummy.next;
    this.dummy.next = headNode;
    this.size++;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    var tailNode = new ListNode(val);
    var cur = this.dummy;
    while(cur.next != null){
        cur = cur.next;
    }
    cur.next = tailNode;
    this.size++;
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index < 0 || index > this.size){
        return;
    }
    var newNode = new ListNode(val);
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    newNode.next = cur.next;
    cur.next = newNode;
    this.size++;
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index < 0 || index > this.size - 1) {
        return;
    }
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    cur.next = cur.next.next;
    this.size--;    
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * var obj = new MyLinkedList()
 * var param_1 = obj.get(index)
 * obj.addAtHead(val)
 * obj.addAtTail(val)
 * obj.addAtIndex(index,val)
 * obj.deleteAtIndex(index)
 */

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

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

相关文章

国内人工智能产业发展现状及对策研究

一、引言 人工智能作为新时代科技革命和产业变革的核心力量&#xff0c;正深刻改变着全球经济格局。我国政府高度重视人工智能产业发展&#xff0c;将其列为国家战略性新兴产业。在此背景下&#xff0c;本文旨在分析我国人工智能产业发展现状&#xff0c;探讨面临的挑战&#x…

java基础面试题总结

java基础面试题总结 目录 前言 1. JVM vs JDK vs JRE的了解 2. 谈谈你对编程、编译、运行的理解 3. 什么是字节码?采用字节码的好处是什么? 5. java中的注解有几种&#xff0c;分别是什么&#xff1f; 6. 字符型常量和字符串常量 7.标识符和关键字的认识 8. 泛型&#xff…

初识Verilog HDL其二

文章目录 运算符往期回顾 运算符 往期回顾 初识Verilog HDL其一

储能运维管理云平台解决方案EMS能量管理系统

在储能行业蓬勃发展的今天&#xff0c;储能运维管理的重要性日益凸显。而储能运维管理云平台的出现&#xff0c;正为储能系统的稳定运行和高效管理注入了新的活力。 一、储能运维管理面临的挑战 传统的储能运维管理方式往往依赖人工巡检和现场操作&#xff0c;存在诸多问题。比…

虚幻引擎 | 实时语音转口型 Multilingual lipsync

实时语音转口型&#xff1a;EPIC的metahuman sdk&#xff0c;NVIDIA的audio2face&#xff0c;都好。本文使用metahuman sdk 需要工具&#xff1a;Metahuman SDK网页账号&#xff0c;获取两日免费tokens https://space.metahumansdk.io/#/unauthorized ———————————…

6,csdn 语法

1 &#xff0c;标题 &#xff1a; 1.1 &#xff0c;语法 &#xff1a; 1 &#xff0c;语法 &#xff1a;几级标题&#xff0c;就几个井号   例如&#xff1a;### 1.1&#xff0c;语法 2 &#xff0c;小技巧 &#xff1a; 2.1&#xff0c;一条横线 &#xff1a; 1 &#x…

Table列表复现框实现【勾选-搜索-再勾选】

Table列表复现框实现【勾选-搜索-再勾选】 概要整体架构流程代码实现技术细节注意参考文献 概要 最近在开发时遇到一个问题&#xff0c;在进行表单渲染时&#xff0c;正常选中没有问题&#xff0c;单如果需要搜索选中时&#xff0c;一个是已选中的不会回填&#xff0c;二是在搜…

【运营攻略】怎样进行游戏产品的定位

关于游戏商业化设计的一些思考 - 游戏干饭之家 游戏运营进阶&#xff1a;数据分析驱动游戏版本调优 - 游戏干饭之家 在深入挖掘某款游戏数据时&#xff0c;发现了一个有趣的现象&#xff1a;70%的玩家好友数量在1-5个之间&#xff0c;11%的玩家好友数在6-10个&#xff0c;而平…

Fiddler下载安装及汉化

直接上干货 1.下载地址&#xff1a; 通过百度网盘分享的文件&#xff1a;fiddler汉化&#xff0c;FiddlerSetup抓包.exe等2个文件 链接&#xff1a;https://pan.baidu.com/s/12JBZO8z0mDHlHM1DCL365g 提取码&#xff1a;1111 2.fiddler安装&#xff1a; 注意安装位置 3.汉化&…

基于协同过滤+python+django+vue+的音乐推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

计算机毕业设计 在线新闻聚合平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

象过河手机进销存,外出办公更方便,随时了解经营情况

你还在为外出时无法即时查看库存、处理订单而烦恼吗&#xff1f;电脑端进销存虽强&#xff0c;但一离开办公桌就仿佛与店铺“失联”&#xff0c;那些紧急的调货请求、客户咨询&#xff0c;都让人手忙脚乱&#xff01; 这里强烈推荐你试试【象过河手机进销存】&#xff0c;它就像…

计算机网络入门基础

1. 基础概念 我们在聊网络的时候&#xff0c;就像是我们在日常生活中寄信一样。我们可以把网络想象成一个巨大的邮局系统&#xff0c;负责把信息从一个地方传送到另一个地方。 a. 什么是协议栈&#xff1f; 协议栈就像是寄信过程中的多个步骤。我们可以把它想象成寄信的时候…

Python3 SMTP发送邮件

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 Python创建 SM…

Kotlin:1.9.0 的新特性

一、概述 Kotlin 1.9.0版本英语官方文档 Kotlin 1.9.0 中文官方文档 The Kotlin 1.9.0 release is out and the K2 compiler for the JVM is now in Beta. Additionally, here are some of the main highlights: Kotlin 1.9.0版本已经发布&#xff0c;用于JVM的K2编译器现在…

运用Java实现倒计时功能

这个功能其实是比较好实现的&#xff0c;一般来说java中实现倒计时有两种方法&#xff1a; 1、使用 scheduledexecutorservice创建一个可重复执行的任务&#xff0c;直到时间到&#xff1a; ScheduledExecutorService 是 Java 中一种用于安排延迟或定期任务的工具。我们可以使…

PMP--一模--解题--61-70

文章目录 14.敏捷61、 [单选] 作为估算活动持续时间过程的一部分&#xff0c;项目经理促成了与产品负责人和Scrum团队的冲刺计划会议。项目经理将用户故事分解为较小的任务项&#xff0c;以小时为单位估算所需时间&#xff0c;并根据团队的能力确定冲刺待办事项列表。尽管计划周…

6. Transforms的使用(一)--ToTensor()

Transforms的使用&#xff08;一&#xff09; 1.使用ToTensor类将数据转化为Tensor形式 导入需要使用的transforms类 from torchvision import transforms创建ToTensor类的实例 totensor transforms.ToTensor()将读取的图片ndarray数据转化为Tensor数据 img cv.imread(img_p…

SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report

上一章讲了Fiori UI5开发环境搭建和实践&#xff1a; - VSCode 安装Fiori Tools插件 - SEGW 创建后台程序&#xff0c;注册服务&#xff0c;Gateway Client确认服务 - 使用SEGW公开的服务来查询数据显示到页面 SAP学习笔记 - 开发05 - Fiori UI5 开发环境搭建2 Fiori Tools…

react js 使用 useEffect 钩子

起因&#xff0c; 目的: useEffect() &#xff0c; 已经遇见好几次了。 我的理解是&#xff0c; 页面加载完成之后&#xff0c;会执行这个函数。&#xff1f;&#xff1f;&#xff1f; 写个例子&#xff0c; 请求 api import React, { useState, useEffect } from "re…