力扣刷题--设计链表707

这个题目的难点:

  • 确定index是什么,index的范围
  • 向后遍历的次数,也就是循环的次数
  • 在某处添加或者删除一个结点,需要找到它的前一个结点

在这里插入图片描述

单链表

首先对于创建一个链表,需要单链表结构

public class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

再设计一个自己的链表
对于一个链表,有两个成员成员变量:、

  1. size(记录链表长度)
  2. head(一个虚拟头结点)

初始化一个链表:

//    初始化这个链表
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);  //创建一个虚拟头节点
    }

获取索引处的数值

在这里插入图片描述
比如上图,要找index=2时候的数值:
首先确定index的范围是否有效:if (index < 0 || index >= size)
找到index这个节点 for(int i = 0; i <= index; i++)

    //获取索引处的数值
    //获取索引处的数值
    public int get(int index) {
        //index范围: 0,size-1
        if (index >= size || index <0){
            return -1;
        }
        ListNode cur = head;
        //因为包含一个虚拟头节点 所以要多移动一位
        for (int i = 0; i <= index; i++) {
            cur= cur.next;
        }
        return cur.val;
    }

在头处加入数值

在这里插入图片描述

不需要进行任何判断,因为虚拟头节点一直都在。
需要注意的是插入步骤不能反了,否则会出现指针丢失,找不到下一个节点的状况。

  //也就是在head节点和第一个节点直接加入一个节点
    public void addAtHead(int val) {
        ListNode temp = new ListNode(val);
        temp.next =head.next;
        head.next = temp;
        size++;
    }

在最后加入一个数值

在这里插入图片描述
先找到最后一个节点:也就是cur的遍历次数:for(int i = 0; i < size ; i++)
再进行插入。

 
    public void addAtTail(int val) {
        ListNode cur = head;
        for (int i = 0; i < size; i++) {
            cur = cur.next;
        }
        ListNode temp = new ListNode(val);
        cur.next = temp;
        temp.next = null;
        size++;
    }

在索引处加入一个数值

首先需要明确的是插入的index的范围:
值得注意的是index=size这个地方可能会被遗漏,index的范围是[0,size-1],但是插入的时候,index=size是可以的,这相当于在当前列表的最后插入了一个节点。
在这里插入图片描述
然后是插入步骤
比如要在index=3这个地方插入一个结点,需要先找到index=2这个地方,用i进行循环遍历,i的范围为for(int i = 0 ; i < index ; i++)
需要注意的是,在index处插入一个结点,需要找到它的前一个结点,而不是找到它这个结点。
比如下图的temp插入后就成了链表中 index = 3 的结点。
插入的顺序也需要注意一下。
在这里插入图片描述

	public void addAtIndex(int index, int val) {
        if (index > size){
            return;
        }
        if (index < 0){
            index = 0;
        }
        ListNode cur = head;
        //找到要插入处的前一个节点
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        ListNode temp = new ListNode(val);
        temp.next = cur.next;
        cur.next = temp;
        size++;
    }

删除索引处的元素

首先需要确定的是可以删除的index的范围:[0,size-1] (如图所示红色的index部分)
然后需要注意的是,删除一个结点,需要找到它的前一个结点,比如图中,需要删除index=2处的结点,需要找到index=1处的结点,也就是i的循环范围是for(int i = 0 ; i < index ; i ++) ,再执行删除操作,此处的删除操作很简单,就是是得cur.next = cur.next.next.

在这里插入图片描述


    public void deleteAtIndex(int index) {
        if (index < 0){
            return;
        }
        if (index >= size){
            return;
        }
        ListNode cur = head;
        //找到这个索引的前一个节点
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        cur.next = cur.next.next;
        size--;
    }

总结:
链表中需要注意的就是index的范围,每次cur遍历,cur需要遍历几次,找到什么位置。
插入的时候的步骤顺序不能反了,否则会出现找不到下一个结点的状况。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手持终端PDA定制厂家_5G安卓手持机设备/条形码扫描手持机PDA

手持终端PDA是一种功能强大的手持终端设备&#xff0c;具备一维码和二维码扫描功能&#xff0c;广泛应用于门票管理、零售、智能巡检、仓储物资管理、金融、快递等领域。 这款手持终端基于MT6877方案&#xff0c;搭载八核处理器(2xCortex-A78 2.4GHz 6xCortex-A55 2.0GHz)&…

【金猿案例展】首创证券——NoETL敏捷分析解决方案

‍ Aloudata 本项目案例由 Aloudata 投递并参与“数据猿年度金猿策划活动——2023大数据产业年度创新服务企业榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 党的十八大以来&#xff0c;党中央、国务院不断加大金融科技创新支持力度&#xff0c;扩大金融科…

系统存储架构升级分享

一、业务背景 系统业务功能&#xff1a;系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。 系统网络架构: • 部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响 •分布式缓存可进行单独扩容, 与存储及查询功能升级…

中国智造闪耀CES | 木牛科技在美国CES展亮相多领域毫米波雷达尖端方案

素有全球科技潮流“风向标”之称的2024国际消费类电子产品展&#xff08;CES&#xff09;&#xff0c;于1月9-12日在美国拉斯维加斯会议中心举办。CES是全球最大的消费电子和消费技术展览会之一&#xff0c;汇集了世界各地优秀的消费电子和科技公司&#xff0c;带着最好的产品来…

深入理解C#中的引用类型、引用赋值以及 `ref` 关键字

深入理解C#中的引用类型、引用赋值以及 ref 关键字 在C#编程中&#xff0c;理解引用类型、引用赋值以及 ref 关键字的使用对于编写高效、可靠的代码至关重要。本文将深入探讨这些概念&#xff0c;帮助您更好地理解C#的工作原理。 引用类型简介 在C#中&#xff0c;所有的类型都…

机器学习笔记一之入门概念

目录 一 基本分类二 按模型分类概率模型&#xff08;Probabilistic Models&#xff09;非概率模型&#xff08;Non-Probabilistic Models&#xff09;对比结论线性模型 (Linear Models)非线性模型 (Non-linear Models)对比 三 按算法分类1.批量学习&#xff08;Batch Learning&…

centenos下载安装

阿里云镜像下载 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 新建虚拟机 (1) 创建新的虚拟机 可以在主页直接点击创建新的虚拟机也可以在上方&#xff0c;点击文件&#xff0c;新建虚拟机 (2) 选择自定义&#xff08;高级&#xff09; (3) 硬盘兼容性 默认即可。我…

php 函数声明与调用

在 PHP 中&#xff0c;函数声明和调用的语法如下&#xff1a; 函数声明的一般形式为&#xff1a; function functionName($param1, $param2, ...) {// 函数体return $result; // 可选 } 例如&#xff1a; function add($a, $b) {return $a $b; } 函数调用的一般形式为&am…

transbigdata笔记:数据预处理

0 数据 使用 transbigdata/docs/source/gallery/data/TaxiData-Sample.csv at main ni1o1/transbigdata (github.com) 和transbigdata/docs/source/gallery/data/sz.json at main ni1o1/transbigdata (github.com) 0.1 导入库 import transbigdata as tbd import pandas …

通过 Elastic Stack 充分利用电信领域生成式 AI 的力量

作者&#xff1a;Elastic Piotr Kobziakowski, Jrgen Obermann 在瞬息万变的电信领域&#xff0c;Elastic Stack 与生成式 AI 的集成正在开创运营效率和创新的新时代。 这些技术不仅增强了网络运营&#xff0c;而且还彻底改变了各个部门的内部流程。 下面&#xff0c;我们将深入…

Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考

在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码&#xff08;代码有些许改动&#xff0c;语义一样&#xff09;&#xff1a; public class MyTest3 {private static volatile int race 0;private static void increase() {race;}public …

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;视频监控中心录像服务器 二、存储策略服务 &#xff08;一&#xff09;存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…

rocketmq实现延迟消息

SpringBoot整合RocketMQ发送延时消息 springboot rocketmq 延迟消息 Windows下RocketMQ安装及可视化界面搭建 Java 客户端 RocketMQ延迟消息 项目背景 项目中有延时消息的需求&#xff0c;综合考量RocketMQ比较适合。 RocketMQ支持多维度的延迟级别 支持多种消息类型 基…

Windows安装PostgreSQL常见问题总结解决

1.用户权限不足/未关闭防火墙&杀毒软件 1.1.数据库初始化错误 1.2.SQL模块没有成功加载到数据簇 在安装PostgreSQL时&#xff0c;我们可能会遇到1.1和1.2的情况&#xff0c;其实这两个为一类问题&#xff0c;即安装权限不足。首先检测自己的用户是不是本地组Administrator再…

使用 Windbg 分析软件异常时的诸多细节与技巧总结

目录 1、dump文件 1.1、dump文件的生成方式 1.2、dump文件的大小 2、pdb符号文件 2.1、pdb文件的路径设置 2.2、pdb文件的时间戳与名称问题 2.3、如何确定要找哪些pdb文件&#xff1f; 3、使用Windbg静态分析dump文件以及动态调试程序的一般步骤 4、确定发生异常或崩溃…

Vue中的class和style绑定

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介动态绑定class对象语法数组语法 动态绑定style对象语法多重值 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…

MulticoreWare与Imagination一同按下汽车计算工作负载的“加速键”

中国北京 – 2024年1月8日 - MulticoreWare Inc与Imagination Technologies共同宣布已在德州仪器TDA4VM处理器上实现了GPU计算&#xff0c;不仅使算力提升了约50 GFLOPS&#xff0c;而且还实现了自动驾驶和高级驾驶辅助系统&#xff08;ADAS&#xff09;常见工作负载性能的跃升…

MySQL 从零开始:03 基本入门语句

文章目录 1、连接数据库1.1 命令提示符登陆1.2 MySQL 8.0 Command Line Client 登陆1.3 MySQL Workbench 登陆 2、基本语句2.1 查看所有库2.2 创建库2.3 删除库2.4 选择数据库2.5 查看表2.6 创建表2.7 删除表2.8 改表名2.9 清空表 在上一小节中介绍了 MySQL 数据库的安装&#…

【Win10安装Qt6.3】安装教程_保姆级

前言 Windows系统安装Qt4及Qt5.12之前版本和安装Qt.12之后及Qt6方法是不同的 &#xff1b;因为之前的版本提供的有安装包&#xff0c;直接一路点击Next就Ok了。但Qt5.12版本之后&#xff0c;Qt公司就不再提供安装包了&#xff0c;不论是社区版&#xff0c;专业版等&#xff0c…