2-链表-21-设计链表-LeetCode707

2024-05-28 09:04
文章标签 设计 21 链表 leetcode707

本文主要是介绍2-链表-21-设计链表-LeetCode707,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2-链表-21-设计链表-LeetCode707

参考:代码随想录

LeetCode: 题目序号707

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅


707. 设计链表

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

单链表中的节点应该具备两个属性:valnextval 是当前节点的值,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 库。
  • 调用 getaddAtHeadaddAtTailaddAtIndexdeleteAtIndex 的次数不超过 2000

class MyLinkedList {// 链表元素个数int size;// 虚拟头结点,方便操作ListNode head;/*** 初始化链表** @author: CodeZeng1998*/public MyLinkedList() {size = 0;head = new ListNode(0);}/*** 获取指定索引的元素值。** @param index 元素的索引* @return 如果索引有效,返回对应元素的值,否则返回-1。* @author: CodeZeng1998*/public int get(int index) {if (index < 0 || index >= size) {return -1;}ListNode currentListNode = head;// 遍历至目标索引位置for (int i = 0; i <= index; i++) {currentListNode = currentListNode.next;}return currentListNode.val;}/*** 在链表头部添加一个元素。** @param val 要添加的元素值* @author: CodeZeng1998*/public void addAtHead(int val) {addAtIndex(0, val);}/*** 在链表尾部添加一个元素。** @param val 要添加的元素值* @author: CodeZeng1998*/public void addAtTail(int val) {addAtIndex(size, val);}/*** 在指定位置添加一个元素。** @param index 插入位置的索引* @param val 要添加的元素值* @author: CodeZeng1998*/public void addAtIndex(int index, int val) {// 如果索引超出范围,则直接返回if (index > size) {return;}// 如果索引小于0,则将索引调整为0if (index < 0) {index = 0;}size++;ListNode preListNode = head;// 定位到插入位置的前一个节点for (int i = 0; i < index; i++) {preListNode = preListNode.next;}ListNode toAddListNode = new ListNode(val);// 进行插入操作toAddListNode.next = preListNode.next;preListNode.next = toAddListNode;}/*** 删除指定索引位置的元素。** @param index 要删除元素的索引* @author: CodeZeng1998*/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;}// 链表节点类class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}}
}

ChatGPT:

这个 Java 类表示了一个名为 MyLinkedList 的单链表数据结构。让我们逐个解释每个方法的功能:

  1. 构造方法
    • 初始化链表的大小为 0,并创建一个值为 0 的虚拟头节点。这个虚拟头节点简化了对链表的操作。
  2. get(int index)
    • 获取指定索引处节点的值。
    • 如果索引超出了范围,则返回 -1。
    • 它从虚拟头节点开始迭代链表,直到达到所需的索引。
  3. addAtHead(int val)
    • 在链表开头插入一个新节点,给定值为 val。这相当于在索引 0 处添加一个节点。
  4. addAtTail(int val)
    • 在链表末尾插入一个新节点,给定值为 val。这相当于在索引 size 处添加一个节点。
  5. addAtIndex(int index, int val)
    • 在链表的指定索引处插入一个新节点,给定值为 val。
    • 如果索引超出了范围,则不执行任何操作。
    • 它通过遍历链表来找到所需位置前一个索引处的节点,然后在其后插入新节点。
  6. deleteAtIndex(int index)
    • 删除链表中指定索引处的节点。
    • 如果索引超出了范围,则不执行任何操作。
    • 如果索引为 0,则更新虚拟头节点指向第二个节点。
    • 它通过遍历链表来找到所需位置前一个索引处的节点,然后更新其 next 指针以跳过要删除的节点。
  7. ListNode 类
    • 表示链表中的一个节点。
    • 包含一个整数值(val)和一个指向下一个节点的引用(next)。

这个类提供了对单链表进行基本操作的方法,如插入、删除和检索。


707. Design Linked List

Design your implementation of the linked list. You can choose to use a singly or doubly linked list.
A node in a singly linked list should have two attributes: val and next. val is the value of the current node, and next is a pointer/reference to the next node.
If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed.

Implement the MyLinkedList class:

  • MyLinkedList() Initializes the MyLinkedList object.
  • int get(int index) Get the value of the indexth node in the linked list. If the index is invalid, return -1.
  • void addAtHead(int val) Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.
  • void addAtTail(int val) Append a node of value val as the last element of the linked list.
  • void addAtIndex(int index, int val) Add a node of value val before the indexth node in the linked list. If index equals the length of the linked list, the node will be appended to the end of the linked list. If index is greater than the length, the node will not be inserted.
  • void deleteAtIndex(int index) Delete the indexth node in the linked list, if the index is valid.

Example 1:

Input
["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"]
[[], [1], [3], [1, 2], [1], [1], [1]]
Output
[null, null, null, null, 2, null, 3]Explanation
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2);    // linked list becomes 1->2->3
myLinkedList.get(1);              // return 2
myLinkedList.deleteAtIndex(1);    // now the linked list is 1->3
myLinkedList.get(1);              // return 3

Constraints:

  • 0 <= index, val <= 1000
  • Please do not use the built-in LinkedList library.
  • At most 2000 calls will be made to get, addAtHead, addAtTail, addAtIndex and deleteAtIndex.

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

这篇关于2-链表-21-设计链表-LeetCode707的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010124

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+