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.pswp.cn/bicheng/85145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85145.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 關于LINQ語法和類型的使用

常用語法&#xff0c;具體問題具體分析 1. Select2. SelectMany3. Where4. Take5. TakeWhile6. SkipWhile7. Join8. GroupJoin9. OrderBy10. OrderByDescending11. ThenBy12. Concat13. Zip14. Distinct15. Except16. Union17. Intersect18. Concat19. Reverse20. SequenceEqua…

華為OD-2024年E卷-小明周末爬山[200分] -- python

問題描述&#xff1a; 題目描述 周末小明準備去爬山鍛煉&#xff0c;0代表平地&#xff0c;山的高度使用1到9來表示&#xff0c;小明每次爬山或下山高度只能相差k及k以內&#xff0c;每次只能上下左右一個方向上移動一格&#xff0c;小明從左上角(0,0)位置出發 輸入描述 第一行…

Android:使用OkHttp

1、權限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> implementation com.squareup.okhttp3:okhttp:3.4.1 2、GET&#xff1a; new XXXTask ().execute("http://192.168.191.128:9000/xx");private class XXXTask…

Vue3+Element Plus動態表格列寬設置

在 Vue3 Element Plus 中實現動態設置表格列寬&#xff0c;可以通過以下幾種方式實現&#xff1a; 方法 1&#xff1a;動態綁定 width 屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><el-table :data"tableData" style"width: 100%…

【JVM目前使用過的參數總結】

JVM參數總結 筆記記錄 JVM-棧相關JVM-方法區(元空間)相關JVM-堆相關 JVM-棧相關 .-XX:ThreadStackSize1M -Xss1m 上面的簡寫形式【設置棧的大小】 JVM-方法區(元空間)相關 -XX:MaxMetaspaceSize10m 【設置最大元空間大小】 JVM-堆相關 -XX:MaxHeapSize10m -Xmx10m 上面的簡寫形…

AI輔助高考志愿填報-專業全景解析與報考指南

高考志愿填報&#xff0c;這可是關系到孩子未來的大事兒&#xff01;最近&#xff0c;我親戚家的孩子也面臨著這個難題&#xff0c;昨晚一個電話就跟我聊了好久&#xff0c;問我報啥專業好。說實話&#xff0c;這問題真不好回答&#xff0c;畢竟每個孩子情況不一樣&#xff0c;…

Android Studio Windows安裝與配置指南

Date: 2025-06-14 20:07:12 author: lijianzhan 內容簡介 文章中&#xff0c;主要是為了初次接觸 Android 開發的用戶提供詳細的關于 Android Studio 安裝以及配置教程&#xff0c;涵蓋環境準備、軟件下載、安裝配置全流程&#xff0c;重點解決路徑命名、組件選擇、工作空間設置…

SpringAI+DeepSeek-了解AI和大模型應用

一、認識AI 1.人工智能發展 AI&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;使機器能夠像人類一樣思考、學習和解決問題的技術。 AI發展至今大概可以分為三個階段&#xff1a; 其中&#xff0c;深度學習領域的自然語言處理(Natural Lan…

IP5362至為芯支持無線充的22.5W雙C口雙向快充移動電源方案芯片

英集芯IP5362是一款應用于移動電源&#xff0c;充電寶&#xff0c;手機&#xff0c;平板電腦等支持無線充模式的22.5W雙向快充移動電源方案SOC芯片,集成同步升降壓轉換器、鋰電池充電管理、電池電量指示等功能。兼容全部快充協議&#xff0c;同步開關放電支持最大22.5W輸出功率…

手游剛開服就被攻擊怎么辦?如何防御DDoS?

手游新上線時遭遇DDoS攻擊是常見現象&#xff0c;可能導致服務器癱瘓、玩家流失甚至項目失敗。面對突如其來的攻擊&#xff0c;開發者與運營商需要迅速響應并建立長效防御機制。本文提供應急處理步驟與防御策略&#xff0c;助力游戲穩定運營。 一、手游開服遭攻擊的應急響應 快…

秋招是開發算法一起準備,還是只準備一個

THE LAST TIME 昨天晚上半夜有個星球的26屆的同學&#xff0c;私信問我。說目前是只準備開發還是開發算法一起準備&#xff08;兩者技術知識都挺欠缺的&#xff09; 看到這里&#xff0c;肯定有很多同學會說。馬上都該秋招了&#xff0c;還什么多線程開工&#xff0c;趕緊能住編…

web項目部署配置HTTPS遇到的問題解決方法

今天使用nginxtomcatssl完成了web項目的部署&#xff0c;本以為沒有什么問題&#xff0c;但是在頁面測試的時候又蹦出了這么一個問題&#xff0c;大致是說由于配置了HTTPS&#xff0c;但是之前的請求是通過HTTP請求的&#xff0c;所以現在被攔截&#xff0c;由于缺少某些權限信…

理解與建模彈性膜-AI云計算數值分析和代碼驗證

彈性膜在連接生物學理解和工程創新方面至關重要&#xff0c;因為它們能夠模擬軟組織力學、實現先進的細胞培養系統和促進柔性設備&#xff0c;廣泛應用于軟組織生物力學、細胞培養、生物膜建模和生物醫學工程等領域。 ??AI云計算數值分析和代碼驗證 彈性膜在連接生物學理解和…

AI大模型競賽升溫:百度發布文心大模型4.5和X1

AI大模型&#xff0c;作為智能技術的巔峰之作&#xff0c;正逐步改變著我們的生活與工作方式。近期&#xff0c;百度在AI大模型領域的最新動向&#xff0c;無疑為這場科技競賽再添一把火。3月16日&#xff0c;百度正式宣布發布文心大模型4.5及文心大模型X1&#xff0c;這兩款大…

升級OpenSSL和OpenSSH 修復漏洞

升級OpenSSL和OpenSSH 目前版本OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 升級到OpenSSH_9.8p1, OpenSSL 1.1.1u 30 May 2023 服務器CentOS Linux release 7.6.1810 (Core) 一、升級OpenSSL到1.1.1u 下載并編譯 OpenSSL&#xff08;推薦目錄 /usr/local/openssl&…

JavaSE - Object 類詳細講解

定義 是所有類的直接或者間接父類&#xff0c;是 Java 中唯一一個沒有父類的類。其中所有的方法都是可以被子類繼承的。 常用方法 equals方法&#xff1a; 比較兩個對象引用的地址值是否相同&#xff0c;默認情況下是使用 “” 進行比較&#xff0c;但是這個方法一般會被之類…

觀遠ChatBI|讓數據分析像聊天一樣簡單

BI通過收集、整合和分析企業內部的各種數據&#xff0c;幫助企業發現數據中的模式和趨勢&#xff0c;從而做出更明智的商業決策&#xff0c;以此來提升企業的經營能力和競爭力。無論是傳統BI還是自助BI&#xff0c;都是為了在數據和人之間建立一座橋梁&#xff0c;使數據能夠被…

Go語言同步原語與數據競爭:WaitGroup

在Go語言并發編程中&#xff0c;我們經常需要等待多個 goroutine 執行完畢后再繼續下一步操作。Go 提供的 sync.WaitGroup 就是專為這種**“等待一組任務完成”**而設計的同步原語。 一、基本原理 sync.WaitGroup 提供三個主要方法&#xff1a; 方法說明Add(n int)設置等待的…

Java單體架構 vs 分布式架構

Java單體架構 vs 分布式架構 在電商系統開發中&#xff0c;當用戶量從幾百激增到百萬級&#xff0c;你的架構是否還能從容應對&#xff1f;一次代碼更新是否意味著整個系統停機&#xff1f;今天我們就來拆解Java架構設計的核心命題&#xff1a;單體還是分布式&#xff1f; 一、…

day40- 硬件學習之 51單片機II (中斷處理)

一、獨立按鍵的使用 main.c key.c key.h 二、中斷處理 2.1 定義 中斷系統是為使CPU具有對外界緊急事件的實時處理能力而設置的。 當CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完以…