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

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);}}

相关文章:

  • JavaScript基础-阻止事件冒泡
  • Linux 系统目录结构概述-linux024
  • 实现回显服务器(基于UDP)
  • 自定义 eslint 规则
  • PDF转Markdown基准测试
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑3
  • uniapp的app项目,在华为pad上运行,页面显示异常
  • Odoo 如何系统地管理产品从概念设计到废弃淘汰的全过程
  • pycharm 2025.1.1-专业版jupyter notebook远程连接
  • 从STM32到NXP:GPIO就像装修房子,多了个“智能开关”
  • RabbitMQ的交换机和队列概念
  • 前端面试专栏-主流框架:7. React核心概念(组件、JSX、状态管理)
  • 从数据孤岛到智能决策:数据编排如何重构企业数据架构?
  • Java重构实战:小步快跑的高效策略分析
  • 创客匠人:AI重构知识IP定位与变现效率新范式
  • 浏览器读取图片的元数据XMP
  • langchain从入门到精通(七)——利用回调功能调试链应用 - 让过程更透明
  • 如何在 Elementary OS 上安装 Snap Store
  • HarmonyOS 5鸿蒙多端编译实战:从Android/iOS到HarmonyOS 5 的跨端迁移指南详
  • 【Unity】MiniGame编辑器小游戏(一)俄罗斯方块【Tetris】
  • 建设银行网站上不去了/seo基础入门免费教程
  • wordpress 超级卡/重庆百度关键词优化软件
  • 龙泉市住房和城乡建设局网站/网络营销策划方案模板范文
  • 旅游门户网站源码怎么做的/今日新闻摘抄十条简短
  • 电子商务网站开发实训总结/百度推广怎么样
  • 网站免费建站o/营销策划咨询机构