当前位置: 首页 > article >正文

leetcode707-设计链表

leetcode 707
在这里插入图片描述

思路

本题也是用了虚拟头节点来进行解答,这样的好处是,不管是头节点还是中间的节点都可以当成是中间节点来处理,用同一套方法就可以进行处理,而不用考虑太多的边界条件。
下面题目中最主要的实现就是添加操作addAtIndex和删除操作deleteAtIndex,对于在头节点和尾节点添加其实都是调用添加方法就可以,头节点设置index = 0, 尾节点设置index = size

get

获取某个节点值,通过循环遍历到当前节点,设置一个cur来记录每次遍历到的当前节点,然后返回cur.val

add

我们要添加的时候一定需要找到的是索引的前一个节点,因为这样才可以进行添加,如果找成了后一个节点,那么我们由于这里设置的是单向链表,就无法再去索引到前一个节点,也就没办法进行连接,找到了前一个节点之后,需要先把要添加到节点设置为cur.next,然后再设置cur.next = node; ,注意这里顺序一定不能错,一旦先把cur.next 设置为node以后,原先的cur.next就断掉,node.next就无法继续设置

delete

这里删除操作可以参考前一篇的博文:移除链表元素
不过这里的删除操作会更简单一些,总的来说就是跳过需要删除的节点,把cur.next 设置为cur.next.next

实现

// 创建链表节点
class CreateNode{
    constructor(val,next){
        this.val = val ?? 0;
        this.next = next ?? null;
    }
}

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

/** 
获取下标为index的值
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function(index) {
    if(index < 0 || index >= this.size) return -1;
    let cur = this.dummy.next;
    for(let i = 0; i < index;i++){
        cur = cur.next
    }
    return cur.val;
};

/** 
添加到头节点
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    this.addAtIndex(0,val);
};

/** 
添加到尾节点
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    this.addAtIndex(this.size,val);
};

/** 
添加到index节点前
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index < 0 || index > this.size) return;
    // 可以进行添加,size++
    this.size++;
    let cur = this.dummy;
    for(let i = 0;i<index;i++){
        cur = cur.next;
    }
    // 进行添加操作
    const node = new CreateNode(val);
    node.next = cur.next;
    cur.next = node;
};

/** 
删除节点
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index >= this.size || index < 0) return;
    // 可以进行删除,长度size-1
    this.size--
    // 获取到可删除的节点的前一个节点
    let cur = this.dummy;
    for(let i = 0;i<index;i++){
        cur=cur.next;
    }
    // 删除操作
    cur.next = cur.next.next
};

http://www.kler.cn/a/509338.html

相关文章:

  • 【Linux系列】查看服务器是否使用了 SSD 的多种方法
  • Docker私有仓库管理工具Registry
  • python如何解析word文件格式(.docx)
  • 文件操作:系统IO
  • Power Automate 实现字符串分割、替换、换行显示
  • QT:IconButton的动画效果
  • 电脑风扇声音大怎么办? 原因及解决方法
  • github 端口22 超时问题解决
  • AWS物联网连接的数据记录器在冰川环境中的性能比较:Campbell CR1000X与ESP32开源
  • 【react】使用antd Table渲染数据遇到的报错问题
  • 用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)
  • redis安装教程(windows)
  • 从零到一:Spring Boot 与 RocketMQ 的完美集成指南
  • 25/1/18 嵌入式笔记 STM32F103
  • Golang——常用库sync
  • QT 使用QSqlTableModel对数据库进行创建,插入,显示
  • github登录用的TOTP和恢复码都丢失了怎么办
  • linux m、mm、mmm函数和make的区别
  • 与“神”对话:Swift 语言在 2025 中的云霓之望
  • Qt的核心机制概述
  • Google Titans: 测试阶段的学习与记忆
  • OLED--软件I2C驱动__标准库和HAL库
  • Windows 上安装 MongoDB 的 zip 包
  • Git简介
  • Rust 强制类型转换和动态指针类型的转换
  • Springboot的自动装配原理