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

算法第十一天:leetcode707.设计链表

一、设计链表的题目描述与链接

    707.设计链表的链接如下表所示,您可直接复制下面网址进入力扣学习,在观看下面的内容之前一定要先做一遍哦,这样才能印象深刻!

https://leetcode.cn/problems/design-linked-list/icon-default.png?t=N7T8https://leetcode.cn/problems/design-linked-list/

题目描述:

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

单链表中的节点应该具备两个属性: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 。

 

二、Java版

    设计链表该题可用单链表的思想去做,示例代码如下代码块所示:

class ListNode {int val;ListNode next;ListNode(){}ListNode(int val){this.val=val;}
}class MyLinkedList {int size;ListNode head; //虚拟头节点//初始化链表public MyLinkedList() {size=0;head=new ListNode(0);}public int get(int index) {if(index<0||index>=size){return -1;}ListNode currentNode=head;for(int i=0;i<=index;i++){currentNode=currentNode.next;}return currentNode.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 pred=head;for(int i=0;i<index;i++){pred=pred.next;}ListNode toAdd=new ListNode(val);toAdd.next=pred.next;pred.next=toAdd;}public void deleteAtIndex(int index) {if(index<0||index>=size){return;}size--;if(index==0){head=head.next;return;}ListNode pred=head;for(int i=0;i<index;i++){pred=pred.next;}pred.next=pred.next.next;}
}

三、设计链表的具体思路

  1. 定义虚拟头节点head,存储链表元素的个数size,然后初始化链表;
  2. 获取第Index个节点的数值,注意Index是从0开始的,第0个节点就是头节点。如果Index非法,则返回-1;
  3. 对addAtIndex函数进行解析,​​​​在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点;index 等于链表的长度,则说明是新插入的节点为链表的尾结点;index 大于链表的长度,则返回空。

 

   最后,感谢各位读者的阅读与支持,您的支持是我前进的动力!我希望我的博文能够带给您有用的算法知识和启发。希望本题对大家有帮助,谢谢各位读者的支持!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Step-DPO 论文——数学大语言模型理解
  • d3d12.dll 文件缺失如何解决?五种修复丢失问题的方法
  • [CP_AUTOSAR]_分层软件架构_接口之通信模块交互介绍
  • MyBatis框架学习笔记(四):动态SQL语句、映射关系和缓存
  • 【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini
  • 前端Vue组件技术实践:构建自定义动态宫格菜单按钮组件
  • SpringBoot连接PostgreSQL+MybatisPlus入门案例
  • 昇思25天学习打卡营第18天|Pix2Pix实现图像转换
  • 前端组件化探索与实践:Vue自定义暂无数据组件的开发与应用
  • CV12_ONNX转RKNN模型(谛听盒子)
  • 深度学习每周学习总结N4:中文文本分类-Pytorch实现(基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))
  • tcp协议下的socket函数
  • DICOM CT\MR片子免费在线查看工具;python pydicom包加载查看;mayavi 3d查看
  • vxe-弹窗初始化激活选中Vxe-Table表格中第一行input输入框
  • debian 更新源
  • 收藏网友的 源程序下载网
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • React-生命周期杂记
  • SOFAMosn配置模型
  • windows-nginx-https-本地配置
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对超线程几个不同角度的解释
  • 多线程 start 和 run 方法到底有什么区别?
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 鱼骨图 - 如何绘制?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #{}和${}的区别是什么 -- java面试
  • #《AI中文版》V3 第 1 章 概述
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (55)MOS管专题--->(10)MOS管的封装
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (接口自动化)Python3操作MySQL数据库
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (译)计算距离、方位和更多经纬度之间的点
  • .NET 4.0中的泛型协变和反变
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core中如何集成RabbitMQ
  • .NET 反射的使用
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .Net6 Api Swagger配置
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .考试倒计时43天!来提分啦!
  • @antv/g6 业务场景:流程图
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [1204 寻找子串位置] 解题报告
  • [Android]使用Retrofit进行网络请求