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

LeetCode 707. 设计链表(单链表、(非循环)双链表 模板)

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  • MyLinkedList() 初始化 MyLinkedList 对象。
  • int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
  • void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  • void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  • void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  • void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例:

输入
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3
myLinkedList.get(1);              // 返回 2
myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3
myLinkedList.get(1);              // 返回 3

提示:

  • 0 <= index, val <= 1000
  • 请不要使用内置的 LinkedList 库。
  • 调用 getaddAtHeadaddAtTailaddAtIndex 和 deleteAtIndex 的次数不超过 2000 。

解题思路:

都在代码里

(什么时候加this什么时候不加? 感觉刷题的时候好像不用考虑权限修饰符和this)

代码如下:

单链表:

class ListNode { // 单链表结点定义int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}
}class MyLinkedList {int size; // size存储链表元素的个数ListNode head; // 虚拟头结点public MyLinkedList() { // 初始化链表size = 0;head = new ListNode(0);}public int get(int index) { // 获取第index个结点的数值,index从0开始,第0个结点就是头结点if(index < 0 || index >= size) return -1;ListNode cur = head; // 新建一个结点指针,初始指向头结点for(int i = 0; i <= index; i++) { // index从0开始,第0个结点是头结点cur = cur.next; // 指针cur不断向后移动,直到指向了第index个结点}return cur.val;}public void addAtHead(int val) { // 先实现addAtIndex,头插就相当于在第0个结点前添加addAtIndex(0, val);}public void addAtTail(int val) { // 先实现addAtIndex,尾插就相当于在第(size)个结点前添加addAtIndex(size, val);}public void addAtIndex(int index, int val) { // 在第index个结点前插入一个新结点if(index > size) return;if(index < 0) index = 0;size++;ListNode pre = head; // 找到要插入结点的前驱结点for(int i = 0; i < index; i++) {pre = pre.next;}ListNode newNode = new ListNode(val); // 插入该结点newNode.next = pre.next;pre.next = newNode;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) return ;size--;if(index == 0) {head = head.next;return;}ListNode pre = head;for(int i = 0; i < index; i++) {pre = pre.next;}pre.next = pre.next.next;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/

双链表:
 

class ListNode { // 双链表结点定义int val;ListNode pre;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}
}class MyLinkedList {int size; // 双链表长度ListNode head; //设置一个头指针指向虚拟头结点ListNode tail; //设置一个尾指针指向最后一个结点public MyLinkedList() { // 初始化size = 0;head = new ListNode(0);tail = new ListNode(0);// 关键:初始时要把头尾结点先连起来,即对头结点和尾结点的指针进行初始化head.pre = null;head.next = tail;tail.pre = head;tail.next = null;}public int get(int index) {if(index < 0 || index >= size) return -1;ListNode cur = head;if(index >= size / 2) { // 判断从哪边开始遍历时间更短cur = tail; // 从尾结点开始往前for(int i = size - 1; i >= index; i--) {cur = cur.pre;}} else {for(int i = 0; i <= index; i++) {cur = cur.next;}}return cur.val;}public void addAtHead(int val) {addAtIndex(0, val);}public void addAtTail(int val) {addAtIndex(size, val);}public void addAtIndex(int index, int val) {if(index > size) return;if(index < 0) index = 0;size++;ListNode prePointer = head;for(int i = 0; i < index; i++) { //找到待插入结点的前一个结点prePointer = prePointer.next;}ListNode newNode = new ListNode(val);newNode.next = prePointer.next;prePointer.next.pre = newNode;newNode.pre = prePointer;prePointer.next = newNode;}public void deleteAtIndex(int index) {if(index < 0 || index >= size) return;size--;ListNode prePointer = head;for(int i = 0; i < index; i++) {prePointer = prePointer.next;}prePointer.next.next.pre = prePointer;prePointer.next = prePointer.next.next;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/

相关文章:

LeetCode 707. 设计链表(单链表、(非循环)双链表 模板)

你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一个节点…...

深入了解Flutter中Overlay的介绍以及使用

Flutter Overlay 介绍 在 Flutter 中&#xff0c;Overlay 是一种特殊的 Widget&#xff0c;它可以用来在应用程序的其他部分之上显示内容。Overlay 非常适合用于显示模态对话框、弹出菜单、工具提示等。 Overlay 的工作原理 Overlay 位于 Flutter 的渲染树之外&#xff0c;这…...

文本直接生成2分钟视频,即将开源模型StreamingT2V

Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间&#xff0c;动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美&#xff0c;但在高速运…...

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测 目录 时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测&#xff08;完整源码…...

FPGA高端图像处理开发板-->鲲叔4EV:12G-SDI、4K HDMI2.0、MIPI等接口谁敢与我争锋?

目录 前言鲲叔4EV----高端FPGA图像处理开发板核心板描述底板描述配套例程源码描述配套服务描述开发板测试视频演示开发板获取 前言 在CSDN写博客传播FPGA开发经验已经一年多了&#xff0c;帮助了不少人&#xff0c;也得罪了不少人&#xff0c;有的人用我的代码赢得了某些比赛、…...

linux练习-交互式传参

在shell脚本中&#xff0c;read 向用户显示一行文本并接受用户输入 #!/bin/bash read -p 依次输入你的姓名、年龄、家乡 name age home echo 我是$name,年龄$age,我来自$home...

【数据结构(一)】初识数据结构

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…...

前端三剑客 —— CSS (第六节)

目录 内容回顾&#xff1a; 弹性布局属性介绍 案例演示 商品案例 布局分析 登录案例 网格布局 内容回顾&#xff1a; 变量&#xff1a;定义变量使用 --名称&#xff1a;值&#xff1b; 使用变量&#xff1a; 属性名&#xff1a;var&#xff08;--名称&#xff09;&a…...

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…...

Rust语言之属性宏(Attribute Macro)derive

文章目录 Rust语言之属性宏&#xff08;Attribute Macro&#xff09;derive Rust语言之属性宏&#xff08;Attribute Macro&#xff09;derive 属性宏是一种基于属性的宏&#xff0c;用于修改、扩展或注解 Rust 代码。它们通常用于为函数、结构体、枚举、模块等添加元数据或自…...

[技术闲聊]我对电路设计的理解(六)-原理图封装

电路设计的直观体现就是完整的原理图&#xff0c;绘制电路图阶段的第一步&#xff0c;绘制原理图封装库。 封装库一共有两种&#xff0c;一种是原理图封装库&#xff0c;一种是PCB封装库&#xff0c;如下图所示。 原理图封装和PCB封装之间的唯一关联就是 引脚位号&#xff0c;…...

算法(滑动窗口四)

1.串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff…...

学习记录:bazel和cmake运行终端指令

Bazel和CMake都是用于构建软件项目的工具&#xff0c;但它们之间有一些重要的区别和特点&#xff1a; Bazel&#xff1a; Bazel是由Google开发的构建和测试工具&#xff0c;用于构建大规模的软件项目。它采用一种称为“基于规则”的构建系统&#xff0c;它利用构建规则和依赖关…...

蓝桥杯刷题--python-37-分解质因数

3491. 完全平方数 - AcWing题库 nint(input()) res1 i2 while i*i<n: if n%i0: t0 while n%i0: n//i t1 if t%2: res*i i1 if n>1: res*n print(res) 4658. 质因数个数 - AcWing题库…...

Delphi编写的图片查看器

UNIT Unit17;INTERFACEUSESWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtDlgs, Vcl.ExtCtrls, Vcl.Imaging.jpeg; //注意&#xff1a;要加入jpej 否侧浏览图…...

Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐

前言 最近在开发swing客户端时候碰到一个棘手的问题&#xff1a; Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐如果是vue或者react&#xff0c;一搜百度什么都出来了&#xff0c;swing的话&#xff0c;嗯。。。资料有点少而且大部分是stack overflow上面的…...

C# MES通信从入门到精通(8)——C#调用Webservice服务进行数据交互

前言 在上位机开发领域,使用webservice来访问客户的终端Mes系统是一项必备的技能,本文详细介绍了如何在c#中调用webservice服务,不仅介绍了使用添加服务引用直接调用webservice中的方法外还介绍了使用http的post方法调用webservice方法,过程详细且均为实战经验总结,对于初…...

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你…...

神经网络汇聚层

文章目录 最大汇聚层平均汇聚层自适应平均池化层 最大汇聚层 汇聚窗口从输入张量的左上角开始&#xff0c;从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置&#xff0c;它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚…...

2024.3.8力扣每日一题——找出美丽数组的最小和

2024.3.8 题目来源我的题解方法一 数学 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2834 我的题解 方法一 数学 经过分析&#xff0c;在target之前&#xff0c;取小于等于target/2的正整数才能使得和最小&#xff0c;并且满足条件3。 时间复杂度&#xff1a;O(n) 空…...

OFA模型在零售行业的视觉问答应用案例

OFA模型在零售行业的视觉问答应用案例 1. 引言 走进任何一家现代零售商店&#xff0c;你都会看到成千上万的商品整齐地陈列在货架上。但对于店员来说&#xff0c;要快速准确地回答"这个品牌的洗发水有没有无硅油版本&#xff1f;"或者"这款饼干是否含有坚果成…...

从CPU到内存:用74LS74芯片手把手教你搭建一个D边沿触发器(附波形图分析)

从面包板到示波器&#xff1a;用74LS74芯片实战D边沿触发器的完整指南 当你第一次在数字电路课本上看到"D边沿触发器"这个词时&#xff0c;是否感觉它像是一个抽象的黑盒子&#xff1f;教科书上的真值表和波形图虽然精确&#xff0c;但总缺少那么一点"触手可及&…...

融合多尺度特征与注意力机制的YOLOv5红外小目标检测优化方案

1. 红外小目标检测的技术挑战 红外遥感图像中的小目标检测一直是计算机视觉领域的难点问题。与可见光图像相比&#xff0c;红外图像具有低对比度、高噪声、目标尺寸小等特点&#xff0c;这使得传统检测算法难以取得理想效果。在实际应用中&#xff0c;军事侦察中的无人机识别、…...

AEC-Q100到AEC-Q200:汽车电子组件认证标准差异与应用场景详解

AEC-Q100到AEC-Q200&#xff1a;汽车电子组件认证标准差异与应用场景详解 当一辆现代汽车驶过零下40度的北极圈&#xff0c;又穿越50度的沙漠高温&#xff0c;其电子系统仍需要保持毫秒级的响应精度——这种极端可靠性背后&#xff0c;是AEC-Q系列认证标准构筑的质量防线。作为…...

vscode|无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No such

无法连接到远程主机服务器&#xff08;错误&#xff1a; CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: "No such file or directory" })))这是一个典型的 VSCode Remote-SSH 连接失败 错误。虽然本地网络正常、服务器在线&#xff0c;但 VSCod…...

CAN总线数字信号特性与工程应用解析

1. CAN总线信号本质解析CAN总线采用数字信号传输机制&#xff0c;这是由其底层电气特性和协议设计决定的。在物理层上&#xff0c;CAN总线使用差分电压信号&#xff08;CAN_H和CAN_L&#xff09;表示逻辑状态&#xff1a;当CAN_H电压高于CAN_L约1.5V时表示显性位&#xff08;逻…...

5分钟解锁网盘直链下载:告别限速,拥抱满速自由

5分钟解锁网盘直链下载&#xff1a;告别限速&#xff0c;拥抱满速自由 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度而烦恼吗&#xff1f;你是否经历过下载一个几GB的文件…...

探索声发射 b 值:Matlab 程序之旅

声发射b值&#xff0c;Matlab程序在材料科学和岩石力学等领域&#xff0c;声发射&#xff08;Acoustic Emission&#xff0c;AE&#xff09;技术是研究材料内部损伤演化的重要手段。而声发射 b 值作为其中一个关键参数&#xff0c;能反映材料内部微破裂的特征。今天&#xff0c…...

别再纠结Copilot了!手把手教你用CodeGPT插件在IDEA里免费接入DeepSeek Coder

告别Copilot依赖&#xff1a;用DeepSeek CoderCodeGPT打造免费智能编程环境 在代码补全工具领域&#xff0c;GitHub Copilot长期占据主导地位&#xff0c;但其每月10美元的订阅费用让许多独立开发者和小团队望而却步。今天我要分享的这套方案&#xff0c;不仅完全免费&#xf…...

**实时内核中的任务调度机制:从理论到C++实现的深度探索**在嵌入式系统和高实时性应用中,**实时内核(Real-

实时内核中的任务调度机制&#xff1a;从理论到C实现的深度探索 在嵌入式系统和高实时性应用中&#xff0c;实时内核&#xff08;Real-Time Kernel&#xff09; 是整个系统稳定运行的核心。它不仅负责资源分配&#xff0c;还承担着任务调度、中断响应、同步机制等关键职责。本文…...