707. 设计链表

server/2024/9/19 14:41:34/ 标签: 链表, 算法, 数据结构, golang
  1. 设计链表

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

链表中的节点应该具备两个属性:val nextval 是当前节点的值,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 库。
  • 调用 get、addAtHead、addAtTail、addAtIndex 和 deleteAtIndex 的次数不超过 2000 。

Go代码

type MyLinkedList struct {Head *ListNode // 链表中保存着头节点的指针即可Size int // 记录链表大小,方便判断索引是否越界
}// type ListNode struct {
//     Val int
//     Next *ListNode
// }func Constructor() MyLinkedList {return MyLinkedList{}
}// 题目说明了下标从0开始
func (this *MyLinkedList) Get(index int) int {if index < 0 || index >= this.Size{return -1}cur := this.Headfor i := 0 ;i < index ;i++ {cur = cur.Next}return cur.Val
}func (this *MyLinkedList) AddAtHead(val int)  {newNode := &ListNode{}newNode.Val = valnewNode.Next = this.Headthis.Head = newNodethis.Size++
}// 下面三个函数都是增删操作,需要找目标节点的前一节点,为了让头节点和其他节点统一操作,可以建立虚拟头节点
func (this *MyLinkedList) AddAtTail(val int)  {newNode := &ListNode{}newNode.Val = val// 要找前一个节点,所以需要虚拟头节点,这样真实头节点和后续节点的操作可以统一dummy := &ListNode{}dummy.Next = this.Headcur := dummyfor cur.Next != nil {cur = cur.Next}// 上面已经知道cur.Next是nil了,说明cur就是最后一个节点cur.Next = newNodethis.Head = dummy.Nextthis.Size++
}func (this *MyLinkedList) AddAtIndex(index int, val int)  {if index < 0 || index > this.Size{return }newNode := &ListNode{}newNode.Val = val// 要找前一个节点,所以需要虚拟头节点,这样真实头节点和后续节点的操作可以统一dummy := &ListNode{}dummy.Next = this.Headcur := dummy// cur开始指在头节点的前一节点,因为是单链表,所以要找到的是cur,实际要操作的是cur.Next// cur 走index步,刚好指着第index位置的节点的前一节点(注意节点索引是从0开始的)for i:=0;i < index;i++{cur = cur.Next}newNode.Next = cur.Nextcur.Next = newNodethis.Head = dummy.Nextthis.Size++
}func (this *MyLinkedList) DeleteAtIndex(index int)  {if index < 0 || index >= this.Size{return }// 要找前一个节点,所以需要虚拟头节点,这样真实头节点和后续节点的操作可以统一dummy := &ListNode{}dummy.Next = this.Headcur := dummy// cur 走index步,刚好指着第index位置的节点的前一节点for i:=0;i < index;i++{cur = cur.Next}cur.Next = cur.Next.Nextthis.Head = dummy.Nextthis.Size--
} /*** Your MyLinkedList object will be instantiated and called as such:* obj := Constructor();* param_1 := obj.Get(index);* obj.AddAtHead(val);* obj.AddAtTail(val);* obj.AddAtIndex(index,val);* obj.DeleteAtIndex(index);*/

在这里插入图片描述


http://www.ppmy.cn/server/117787.html

相关文章

[数据集][目标检测]烟叶病害检测数据集VOC+YOLO格式612张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;612 标注数量(xml文件个数)&#xff1a;612 标注数量(txt文件个数)&#xff1a;612 标注类别…

JavaSE:8、包装类

1、基本类型包装类 包装类于将基本数据类型&#xff08;如 int、float、char 等&#xff09;转换为对应的对象类型 Java 提供了以下包装器类型&#xff0c;与基本数据类型一一对应&#xff1a; Byte&#xff08;对应 byte&#xff09;Short&#xff08;对应 short&#xff09;…

基于C#+SQLServer 2005实现(CS界面)校园卡消费信息系统

校园卡消费信息管理系统 一、前言 1.1 选题说明 校园卡消费信息系统是一个实用并且与我们的学校生活密切相关的管理信息系统&#xff1b;如果能够很好的研究、开发并加以利用&#xff0c;校园卡的相关业务会变得更加简单、学生能更便利地进行消费同时准确了解自己的消费情况…

Vue中的事件修饰符是什么,它们的作用是什么?

在Vue中&#xff0c;事件修饰符是一种用于处理事件的方法&#xff0c;它们可以帮助我们更有效地处理事件&#xff0c;同时提高代码的可读性和可维护性。Vue提供了几个内置的事件修饰符&#xff0c;包括$event、.stop、.prevent、.capture、.self和.once。 1. $event&#xff1…

结构体内存对齐

目录 一、什么是结构体内存对齐二、为什么要结构体内存对齐三、对齐系数四、结构体对齐规则1、例一&#xff1a;文章开头的例子2、例二&#xff1a;稍微复杂的情况3、结合 union 和 struct4、结构体嵌套 一、什么是结构体内存对齐 进入讲解前&#xff0c;先看一段 C 代码&…

DAY13信息打点-Web 应用源码泄漏开源闭源指纹识别GITSVNDS备份

#知识点 0、Web架构资产-平台指纹识别 1、开源-CMS指纹识别源码获取方式 2、闭源-习惯&配置&特性等获取方式 3、闭源-托管资产平台资源搜索监控 演示案例&#xff1a; ➢后端-开源-指纹识别-源码下载 ➢后端-闭源-配置不当-源码泄漏 ➢后端-方向-资源码云-源码泄漏 …

postgresql|数据库|pg_repack和idle_in_transaction_session_timeout参数的关系

一、问题描述 在使用pg_repack这个工具做数据库的表膨胀清理过程中&#xff0c;经常会遇到类似这样的警告&#xff1a; 这里的警告表明在膨胀治理的时候&#xff0c;此表遇到了事务阻塞&#xff0c;而此时我们有三种选择&#xff0c;第一个选择是等待该事务结束&#xff0c;第…

机器学习 vs. 深度学习

目录 引言 机器学习 深度学习 机器学习与深度学习的区别概览 引言 随着人工智能技术的发展&#xff0c;机器学习&#xff08;Machine Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;成为了当今最热门的研究领域之一。尽管这两个术语经常被交替使用&…

【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法与Kruskal算法

目录 一、Prim算法 二、题目与题解 题目&#xff1a;卡码网 53. 寻宝 题目链接 题解1&#xff1a;Prim算法 题解2&#xff1a;Prim算法优化 题解3&#xff1a;Kruskal算法 三、小结 一、Prim算法与Kruskal算法 Prim算法是一种贪心算法&#xff0c;用于求解加权无向图的…

构建高效 Python Web API:RESTful 设计与 GraphQL 实践

构建高效 Python Web API&#xff1a;RESTful 设计与 GraphQL 实践 在现代 Web 开发中&#xff0c;API 是前后端通信的核心枢纽&#xff0c;设计一个高效且易于扩展的 API 是保证系统良好运行的基础。本文详细探讨 RESTful API 的设计准则&#xff0c;如何生成 API 文档&#…

HCIP--<OSPF2>

目录 一&#xff0c;OSPF的不规则区域 1&#xff09;远离骨干区域的非骨干区域 2&#xff09;不连续骨干区域(和上面一样) 二&#xff0c;OSPF数据库表 三。优化OSPF的LSA&#xff08;缺少LSA的更新量&#xff09; [1]手工汇总&#xff1a;减少骨干区域的LSA [2]特殊区域&…

轨道列车舱门检测系统源码分享

轨道列车舱门检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

GitHub图床

GitHub图床 文章目录 GitHub图床图床介绍Github访问GitHub手动修改hostsgithub520 加速器创建账户创建仓库创建token PicGoTypora 图床介绍 图床 存放图片的地方 为什么设置图床呢 在我认识图床之前, 有一个问题 [^放在typora上面的图片, 其实是一个链接, 并且将图片存放在本地…

TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错

目录 1&#xff0c;前言2&#xff0c;二者关系2.1&#xff0c;使用 3&#xff0c;遇到的问题3.1&#xff0c;TS 中使用 JS 1&#xff0c;前言 通过 Vite 创建的 Vue3 TS 项目&#xff0c;根目录下会有 tsconfig.json 和 tsconfig.node.json 文件&#xff0c;并且存在引用关系…

51单片机+proteus+实验(I2C和蜂鸣器)

目录 1.蜂鸣器 1.1基本概念 1.1.1蜂鸣器的简介 1.1.2蜂鸣器的硬件原理 1.1.3蜂鸣器的音色 1.2代码 1.2.1不同音色驱动 1.2.2使用Music Encode1软件来生成音乐 1.3proteus仿真 2.I2C 2.1基本概念 2.1.1 I2C的基本概念 2.1.2 I2C的通讯时序 2.1.3AT24C02数据帧 ​编…

Qt_显示类控件

目录 一、QLabel 1、QLabel属性介绍 2、textFormat文本格式 3、pixmap标签图片 3.1 resizeEvent 4、QFrame边框 5、alignment文本对齐 6、wordWrap自动换行 7、indent设置缩进 8、margin设置边距 9、buddy设置伙伴 二、QLCDNumber 1、QLCDNumber属性介绍 2、实…

【AI大模型】ChatGPT模型原理介绍(下)

目录 &#x1f354; GPT-3介绍 1.1 GPT-3模型架构 1.2 GPT-3训练核心思想 1.3 GPT-3数据集 1.4 GPT-3模型的特点 1.5 GPT-3模型总结 &#x1f354; ChatGPT介绍 2.1 ChatGPT原理 2.2 什么是强化学习 2.3 ChatGPT强化学习步骤 2.4 监督调优模型 2.5 训练奖励模型 2.…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

朴朴超市 签到 任务脚本

脚本主要用于自动化处理朴朴超市APP的签到和组队任务。以下是对脚本中主要方法的作用解析: 初始化和登录 - __init__: - 初始化类对象,设置用户信息和请求头,尝试获取并设置随机位置。 - get_AccessToken: - 使用`refresh_token`刷新并获取`access_token`,用于后续的A…

安卓玩机工具-----ADB与 FASTBOOT模式 图形化 多功能玩机刷机工具

工具说明 这款工具是英文版。易于使用的工具提供了用于运行 ADB 和 Fastboot 命令的图形用户界面。ADB 功能包括旁加载、安装和卸载应用程序、测试设备以及重新启动到不同的模式。可以使用 fastboot 命令进行设备管理;其中包括检查 Antirollback 和 active slots 等变…