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

Java相关-链表-设计链表-力扣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 的节点。

提交到力扣的代码如下:

class ListNode {private Integer val;private ListNode next;public void setVal(Integer val) {this.val = val;}public void setNext(ListNode next) {this.next = next;}public Integer getVal() {return val;}public ListNode getNext() {return next;}
}class MyLinkedList {private ListNode listNode;public void setListNode(ListNode listNode) {this.listNode = listNode;}public ListNode getListNode() {return listNode;}public MyLinkedList(ListNode head) {listNode = head;}public MyLinkedList() {}public int get(int index) {int size = size();if (index < 0 || index > size - 1) {return -1;}ListNode imghead = new ListNode();imghead.setNext(listNode);ListNode cur = imghead.getNext();while (index > 0) {cur = cur.getNext();index = index - 1;}return cur.getVal(); //index=0也是返回cur本身,也就是第一个节点。 index不为0,最终的cur的值就是第index节点的值。}public int size() {//获取长度ListNode cur = listNode;int size = 0;while (cur != null) {size = size + 1;cur = cur.getNext();}return size;}public void addAtHead(int val) {ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead.getNext();//当前节点移动到虚拟头节点的下一个节点imghead.setNext(null);//断开虚拟头节点与下一个节点连接imghead.setNext(newNode);//重新改变指向newNode.setNext(cur);//重新改变指向listNode = newNode;//最终符合题目要求的节点是newNode ,把newNode给listNode}//尾部插入节点public void addAtTail(int val) {ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead;//while (cur.getNext() != null) {cur = cur.getNext();}cur.setNext(newNode);listNode = imghead.getNext();}//在第index前节点插入一个节点public void addAtIndex(int index, int val) {int size = size();if (index < 0 || index > size) {System.out.println("传入的节点index小于0或index超过节点索引,无法插入数据");} else if(index==size){addAtTail(val);}else if (index == 0) {//在头节点前插入addAtHead(val);} else {//index从1到size-1之间ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead.getNext();while (index > 1) {//寻找要插入节点的前一个节点,因为要找的是前一个节点,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext();//先存下下一个节点cur.setNext(newNode);newNode.setNext(tmp);}}//删除第index的节点public void deleteAtIndex(int index) {int size = size();if (index < 0 || index > size - 1) {System.out.println("传入的节点index小于0或index超过节点索引,无法删除数据");} else {ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点if (index == 0) {//删除第一个节点ListNode tmp = imghead.getNext().getNext();imghead.setNext(null);imghead.setNext(tmp);listNode = imghead.getNext();} else {//index从1到size-1之间ListNode cur = imghead.getNext();while (index > 1) {//寻找要删除节点的前一个节点,因为要找的是前一个节点,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext().getNext();//先存下下一个节点cur.setNext(tmp);listNode = imghead.getNext();}}}
}/*** 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);*/

本地测试代码:

package com.company;public class MyLinkedList {private ListNode listNode;public void setListNode(ListNode listNode) {this.listNode = listNode;}public ListNode getListNode() {return listNode;}public MyLinkedList(ListNode head) {listNode = head;}public MyLinkedList() {}public int get(int index) {int size = size();if (index < 0 || index > size - 1) {return -1;}ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);ListNode cur = imghead.getNext();while (index > 0) {cur = cur.getNext();index = index - 1;}return cur.getVal(); //index=0也是返回cur本身,也就是第一个节点。 index不为0,最终的cur的值就是第index节点的值。}public int size() {//获取长度ListNode cur = listNode;int size = 0;while (cur != null) {size = size + 1;cur = cur.getNext();}return size;}public void addAtHead(int val) {ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead.getNext();//当前节点移动到虚拟头节点的下一个节点imghead.setNext(null);//断开虚拟头节点与下一个节点连接imghead.setNext(newNode);//重新改变指向newNode.setNext(cur);//重新改变指向listNode = newNode;//最终符合题目要求的节点是newNode ,把newNode给listNode}//尾部插入节点public void addAtTail(int val) {ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead;//while (cur.getNext() != null) {cur = cur.getNext();}cur.setNext(newNode);listNode = imghead.getNext();}//在第index前节点插入一个节点public void addAtIndex(int index, int val) {int size = size();if (index < 0 || index > size) {System.out.println("传入的节点index小于0或index超过节点索引,无法插入数据");} else if(index==size){addAtTail(val);}else if (index == 0) {//在头节点前插入addAtHead(val);} else {//index从1到size-1之间ListNode newNode = new ListNode();//定义要插入的节点newNode.setVal(val);//给要插入的节点赋值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点ListNode cur = imghead.getNext();while (index > 1) {//寻找要插入节点的前一个节点,因为要找的是前一个节点,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext();//先存下下一个节点cur.setNext(newNode);newNode.setNext(tmp);}}//删除第index的节点public void deleteAtIndex(int index) {int size = size();if (index < 0 || index > size - 1) {System.out.println("传入的节点index小于0或index超过节点索引,无法删除数据");} else {ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定义虚拟头节点if (index == 0) {//删除第一个节点ListNode tmp = imghead.getNext().getNext();imghead.setNext(null);imghead.setNext(tmp);listNode = imghead.getNext();} else {//index从1到size-1之间ListNode cur = imghead.getNext();while (index > 1) {//寻找要删除节点的前一个节点,因为要找的是前一个节点,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext().getNext();//先存下下一个节点cur.setNext(tmp);listNode = imghead.getNext();}}}
}
package com.company;public class ListNode {private Integer val;private ListNode next;public void setVal(Integer val) {this.val = val;}public void setNext(ListNode next) {this.next = next;}public Integer getVal() {return val;}public ListNode getNext() {return next;}
}
package com.company;import javax.swing.tree.TreeNode;
import java.lang.reflect.Array;
import java.util.*;public class Main {public static void main(String[] args) {ListNode head = new ListNode();head.setVal(2);ListNode second = new ListNode();second.setVal(3);head.setNext(second);ListNode third = new ListNode();third.setVal(4);second.setNext(third);ListNode four = new ListNode();four.setVal(5);third.setNext(four);ListNode five = new ListNode();five.setVal(6);four.setNext(five);ListNode six = new ListNode();six.setVal(7);five.setNext(six);MyLinkedList mylist = new MyLinkedList(head);//  int value= mylist.get(5);//  mylist.addAtHead(33);//  mylist.deleteAtIndex(6);//  mylist.addAtIndex(6,44);//  int value2= mylist.get(0);}}

http://www.xdnf.cn/news/14195.html

相关文章:

  • JS进阶 Day02
  • 在tensorrt engine中提高推理性能小记
  • 互联网大厂Java求职面试:云原生架构与微服务设计中的复杂挑战
  • Flask文件上传与异常处理完全指南
  • create_react_agent + MCP tools
  • TDengine 如何从 2.x 迁移到 3.0
  • Java并发编程实战 Day 22:高性能无锁编程技术
  • JAVA关键字-final
  • Semaphore入门案例
  • Java线程池ThreadPoolExecutor的状态
  • ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘%‘
  • 基于 C 语言的图书管理系统开发详解​
  • 基于YOLOv11+PP-OCRv5深度学习的智能车牌检测与识别系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • 【SpringMVC 入门介绍】
  • 零基础RT-thread第二节:按键控制
  • Redux 原理深度剖析
  • 备忘录模式:文本编辑器撤销功能实现
  • 2025年渗透测试面试题总结-字节跳动[实习]安全研究员(题目+回答)
  • 浏览器 报502 网关错误,解决方法2
  • 论文精读Lami-Detr:Open-Vocabulary Detection with Language Model Instruction
  • 芯片的起点——从硅到晶圆制造
  • 用Python写一个可视化大屏
  • 简说ping、telnet、netcat
  • 论文阅读-单目视觉惯性系统时间标定
  • MySQL 锁学习笔记
  • 计算机网络-自顶向下—第二章应用层-重点复习笔记
  • 在C++中的封装(Encapsulation)
  • Linux学习笔记:PCIe内核篇(1):初始化与枚举流程
  • 第1章 C# 和 .NET 框架 笔记
  • MCP简介和应用