【數據結構_6】雙向鏈表的實現

一、實現MyDLinkedList(雙向鏈表)

package LinkedList;public class MyDLinkedList {//首先我們要創建節點(因為雙向鏈表和單向鏈表的節點不一樣!!)static class Node{public String val;public Node prev = null;public Node next = null;//給一個構造方法public Node(String val) {this.val = val;}}//表示整個鏈表,此處不引入傀儡節點,使用Null表示空的鏈表public Node head = null;//為了方便后續的尾插曹祖public Node tail = null;//給一個toStirng的打印@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");//進行鏈表的遍歷for(Node cur = head;cur!= null ;cur = cur.next){stringBuilder.append(cur.val);if(cur.next != null) {stringBuilder.append(",");}}stringBuilder.append("]");return stringBuilder.toString();}//接下來來實現一些雙向鏈表的核心操作//1.實現頭插操作public void addFirst(String val){Node newNode = new Node(val);//首先判斷鏈表是否為空的情況if(head == null){head = newNode;tail = newNode;}else {//再來看看一般情況newNode.next = head;head. prev = newNode;//2.讓head指向新節點head = newNode;}}//2.實現鏈表的尾插操作public void addLast(String val){Node newNode = new Node(val);//1.首先判斷鏈表為空的情況,可知與頭插操作一樣if(head == null){head = newNode;tail = newNode;}else {//2.考慮一般情況tail.next = newNode;newNode.prev = tail;tail = newNode;}}//實現鏈表長度的計算public int size(){int size =0;for(Node cur = head;cur != null;cur = cur.next){size++;}return size;}//3.實現雙向鏈表的按位置插入public void add(int index,String val){int size = size();//1.首先判斷index的值是否合法if( index < 0 || index > size ){throw  new IndexOutOfBoundsException("Index:"+index+",Size:"+size);}//2.判斷特殊位置if(index ==0 ){//此時就是頭插操作addFirst(val);return;}if(index== size){//此時就是尾插addLast(val);return;}//3.進行一般的插入//先找到要插入節點的前一個節點Node prev = head;for(int i =0;i<index-1;i++){prev = prev.next;}//此時我們已經找到了要插入節點的前一個節點Node newNode = new Node(val);Node next = prev.next;//首先建立新節點與上一個節點之間的關系prev.next = newNode;newNode.prev = prev;//再建立新節點與下一個節點之間的關系newNode.next = next;next.prev = newNode;}//4.實現包含查找操作public Boolean contains(String val){for (Node cur = head ; cur != null;cur = cur.next){if(cur.val.equals(val)) {return true;}}return false;}//5.查找元素,返回該元素的下標,如果沒有找到,返回-1public int indexOf(String val){int index =0;for (Node cur = head;cur != null;cur =cur.next){if(cur.val.equals(val)){return  index;}index++;}return -1;}//6.頭刪public void removeFirst(){//1.首先考慮是否為空鏈表if(head == null){return;//空鏈表無法進行刪除操作}//2.考慮只有一個節點的情況if(head.next == null){head = null;tail = null;return;}//3.考慮一般情況head = head.next;head.prev = null;}//7.尾部刪除public void removeLast(){//1.考慮空鏈表if (head == null){return;}//2.考慮只有一個節點if(head.next == null){head = null;tail = null;return;}//3.考慮一般情況tail = tail.prev;tail.next = null;}//8.指定位置刪除public void remove(int index){int size = size();//對index做判斷if(index <0 || index >= size){throw  new IndexOutOfBoundsException("index:"+index+",size:"+size);}//2.如果是刪除index=0if(index ==0){removeFirst();return;}if(index ==size-1){removeLast();return;}//3.考慮一般情況的刪除//先找到前一個節點Node prev = head;for(int i =0;i<index-1;index++){prev = prev.next;}Node toRemove = prev.next;Node next = toRemove.next;//4.進行刪除操作prev.next = next;next.prev =prev;}//9.指定值刪除public void remove(String val){//1.首先考慮空的鏈表if(head == null){return ;}//2.判定頭刪/尾刪操作if(val.equals(head.val)){removeFirst();return;}if(val.equals(tail.val)){removeLast();return;}//3.一般情況 先找到前一個節點Node toRemove = head;for (;toRemove!=null;toRemove= toRemove.next){if(toRemove.val.equals(val)){break;}}//循環之外有兩種情況一種是找到了打破循環 另一種是循環走完了!if(toRemove == null){return ;}Node prev = toRemove.prev;Node next = toRemove.next;prev.next = next;next.prev = prev;}//10.鏈表的清空操作public void clear(){head = null;tail = null;}public static void test(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("b");list.addFirst("c");System.out.println(list);}public static  void test1(){MyDLinkedList list = new MyDLinkedList();list.addLast("c");list.addLast("b");list.addLast("a");System.out.println(list);}public static void test3(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0,"b");list.add(2,"c");System.out.println(list);}public static void test4(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0,"b");list.add(2,"c");System.out.println(list);System.out.println(list.indexOf("a"));System.out.println(list.contains("b"));System.out.println(list.contains("d"));}public static void test5() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.removeFirst();list.removeFirst();System.out.println(list);}public static void test6() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.removeLast();list.removeLast();System.out.println(list);}public static void test7() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.remove(1);list.remove(4);System.out.println(list);}public static void test8() {MyDLinkedList list = new MyDLinkedList();list.addLast("a");list.addLast("b");list.addLast("c");System.out.println(list);list.remove("a");System.out.println(list);}public static void main(String[] args) {//  test();// test1();//test3();// test4();//test5();//test6();//test7();//test8();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76206.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76206.shtml

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

相關文章

做Data+AI的長期主義者,加速全球化戰略布局

在Data與AI深度融合的新紀元&#xff0c;唯有秉持長期主義方能真正釋放數智化的深層價值。2025年是人工智能從技術爆發轉向規模化落地的關鍵節點&#xff0c;也是標志著袋鼠云即將迎來十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功舉辦了“做DataAI的長期主義者——…

構建基于PHP和MySQL的解夢系統:設計與實現

引言 夢境解析一直是人類心理學和文化研究的重要領域。隨著互聯網技術的發展,構建一個在線的解夢系統能夠幫助更多人理解自己夢境的含義。本文將詳細介紹如何使用PHP和MySQL構建一個功能完整的解夢系統,包括系統架構設計、數據庫模型、核心功能實現以及優化策略。 本文源碼下…

【桌面】【系統應用】Samba共享文件夾

目錄 場景一&#xff1a;銀河麒麟桌面與銀河麒麟桌面之間共享文件夾 環境準備 實現目標 操作步驟 &#xff08;一&#xff09;配置主機A共享文件夾 1、環境準備 2、在主機A創建共享文件夾 3、設置共享文件密碼 &#xff08;二&#xff09;主機B訪問主機A 場景二&…

OpenCV 圖形API(37)圖像濾波-----分離過濾器函數sepFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 應用一個可分離的線性濾波器到一個矩陣&#xff08;圖像&#xff09;。 該函數對矩陣應用一個可分離的線性濾波器。也就是說&#xff0c;首先&a…

webpack理解與使用

一、背景 webpack的最初目標是實現前端工程的模塊化&#xff0c;旨在更高效的管理和維護項目中的每一個資源。 最早的時候&#xff0c;我們通過文件劃分的方式實現模塊化&#xff0c;也就是將每個功能及其相關狀態數據都放在一個JS文件中&#xff0c;約定每個文件就是一個獨立…

rac環境下,增加一個控制文件controlfile

先關閉節點二&#xff0c;在節點一上操作 1、查看控制文件個數和路徑 SQL> show parameter control 2、備份參數文件 SQL> create pfile/home/oracle/orcl.pfile20250417 from spfile; 3、修改控制文件參數 SQL> alter system set contr…

git安裝(windows)

通過網盤分享的文件&#xff1a;資料(1) 鏈接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取碼: evu6 點擊next 可修改安裝路徑 默認就行 一般從命令行調用&#xff0c;所以不用創建。 用vscode&#xff0c;所以這么選擇。

Spring Boot整合難點?AI一鍵生成全流程解決方案

在當今的軟件開發領域&#xff0c;Spring Boot 憑借其簡化開發流程、快速搭建項目的優勢&#xff0c;成為了眾多開發者的首選框架。然而&#xff0c;Spring Boot 的整合過程并非一帆風順&#xff0c;常常會遇到各種難點。而飛算 JavaAI 的出現&#xff0c;為解決這些問題提供了…

Python批量處理PDF圖片詳解(插入、壓縮、提取、替換、分頁、旋轉、刪除)

目錄 一、概述 二、 使用工具 三、Python 在 PDF 中插入圖片 3.1 插入圖片到現有PDF 3.2 插入圖片到新建PDF 3.3 批量插入多張圖片到PDF 四、Python 提取 PDF 圖片及其元數據 五、Python 替換 PDF 圖片 5.1 使用圖片替換圖片 5.2 使用文字替換圖片 六、Python 實現 …

山東大學軟件學院創新項目實訓開發日志(15)之中醫知識問答歷史對話查看bug處理后端信息響應成功但前端未獲取到

在開發中醫知識問答歷史對話查看功能的時候&#xff0c;出現了前后端信息獲取異同的問題&#xff0c;在經過非常非常非常艱難的查詢之后終于解決了這一問題&#xff0c;而這一問題的罪魁禍首就是后端沒有setter和getter方法&#xff01;&#xff01;&#xff01;&#xff01;&a…

Arkts應用全局UI狀態存儲和持久化V2(AppStorageV2、PersistenceV2和@Type)

目錄 應用全局UI狀態存儲和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 應用全局UI狀態存儲和持久化V2版本 以下實例AppStorageV2、PersistenceV2和裝飾…

最大子序和問題——動態規劃/貪心算法解決

目錄 一&#xff1a;問題描述 二&#xff1a;解決思路1——動態規劃思想 三&#xff1a;C 語言代碼實現 四&#xff1a;復雜度分析 五&#xff1a;解決思路2——貪心算法思想 六&#xff1a;具體步驟 七: C語言代碼實現 八&#xff1a;復雜度分析 一&#xff1a;問題描述 …

【Python入門】文件讀取全攻略:5種常用格式(csv/excel/word/ppt/pdf)一鍵搞定 | 附完整代碼示例

大家好&#xff0c;我是唐叔&#xff01;今天給大家帶來一篇Python文件讀取的終極指南。無論是數據分析、辦公自動化還是爬蟲開發&#xff0c;文件讀取都是Python程序員必須掌握的核心技能。本文將詳細介紹Python處理5大常用文件格式的方法&#xff0c;包含完整可運行的代碼示例…

四、小白如何用Pygame制作一款跑酷類游戲(頁面暫停和主角跑步動作的實現)

四、小白如何用Pygame制作一款跑酷類游戲&#xff08;頁面暫停和主角跑步動作的實現&#xff09; 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 四、小白如何用Pygame制作一款跑酷類游戲&#xff08;頁面暫停和主…

《基于 RNN 的股票預測模型代碼優化:從重塑到直接可視化》

在深度學習領域&#xff0c;使用循環神經網絡&#xff08;RNN&#xff09;進行股票價格預測是一個常見且具有挑戰性的任務。本文將圍繞一段基于 RNN 的股票預測代碼的改動前后差別展開&#xff0c;深入剖析代碼的優化思路和效果。 原始代碼思路與問題 原始代碼實現了一個完整…

Lambda 函數與 peek 操作的使用案例

Lambda 函數和 peek 操作是 Java 8 Stream API 中非常有用的特性&#xff0c;下面我將介紹它們的使用案例。 Lambda 函數使用案例 Lambda 表達式是 Java 8 引入的一種簡潔的匿名函數表示方式。 集合操作 List<String> names Arrays.asList("Alice", "B…

Docker私有倉庫頁面訪問實現

通過 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有倉庫默認不提供網頁訪問界面。它是一個基于API的后端服務&#xff0c;主要用于鏡像的存儲和管理。但可以通過以下兩種方式實現網頁訪問&#xff1a; 一、通過第三方Web UI工具擴展 1. 使用 D…

[王陽明代數講義]語言模型核心代碼調研

語言模型核心代碼調研 基于Consciciteation?的才氣張量持續思考綜述將文本生成建模為才氣張量網絡擴散過程&#xff0c;實現非自回歸推理通過才氣張量的群-拓撲流形交叉注意力實現多模態推理&#xff0c;將輸入壓縮到低維空間持續迭代提出「條件計算提前終止」機制&#xff0c…

flink jobmanager離奇的heap oom

文章目錄 現象描述開始分析1.初步分析dump文件2.AI分析引用關系分析方向2.1 flink BlobServer bug分析方向2.2 和運行環境有關分析方向2.3 和任務有關 回到問題本身&#xff0c;思考一下1. seatunnel到底有沒有問題2.再次分析zipfile對象3.分析seatunnel es connector 源碼4 懷…

APP動態交互原型實例|墨刀變量控制+條件判斷教程

引言 不同行業的產品經理在繪制原型圖時&#xff0c;擁有不同的呈現方式。對于第三方軟件技術服務公司的產品經理來說&#xff0c;高保真動態交互原型不僅可以在開發前驗證交互邏輯&#xff0c;還能為甲方客戶帶來更直觀、真實的體驗。 本文第三部分將分享一個實戰案例&#…