手動實現LinkedList

前言

大家好,我是Maybe。最近在學習數據結構中的鏈表,自己手動實現了一個LinkedList。我想與大家分享一下。

思維導圖

代碼部分

package Constant;public class constant {public static final String INDEX_IS_WRONG="輸入的下標不合法";
}
package utils;public class IndexException extends RuntimeException{public IndexException() {super();}public IndexException(String message) {super(message);}
}
public interface IList {// 頭插法public void addFirst(int data);// 尾插法public void addLast(int data);// 任意位置插入,第一個數據節點為0號下標public void addIndex(int index,int data);// 查找是否包含關鍵字key是否在單鏈表當中public boolean contains(int key);// 刪除第一次出現關鍵字為key的節點public void remove(int key);// 刪除所有值為key的節點public void removeAllKey(int key);// 得到鏈表的長度public int size();public void display();public void clear();
}
import Constant.constant;
import utils.IndexException;public class LinkedList implements IList {//1.定義一個內部類static class ListNode{public int val;//類型寫成了String,應該是ListNode的public ListNode prev;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode head;//這個就要給個尾了public ListNode last;@Overridepublic void addFirst(int data) {if(head==null){ListNode node=new ListNode(data);head=last=node;}else{ListNode node=new ListNode(data);node.next=head;head.prev=node;head=node;}}@Overridepublic void addLast(int data) {if(head==null){ListNode node=new ListNode(data);//寫成了node=last=null了head=last=node;}else{ListNode node=new ListNode(data);last.next=node;node.prev=last;//這里要注意last=last.next;}}@Override//在LinkedList中找到對應的cur,然后再cur之前插入public void addIndex(int index, int data) {int len=size();if(index<0||index>len){String msg= constant.INDEX_IS_WRONG+index;throw new IndexException(msg);}if(index==0){addFirst(data);}else if(index==len){addLast(data);}else{ListNode node=new ListNode(data);ListNode cur=findIndex(index);node.next=cur;cur.prev.next=node;node.prev=cur.prev;cur.prev=node;}}//在LinkedList中找到對應的curprivate ListNode findIndex(int index){if(head==null){return null;}else{ListNode cur=head;while(index!=0){cur=cur.next;index--;}return cur;}}@Overridepublic boolean contains(int key) {if(head==null){return false;}else{ListNode cur=head;while(cur!=null){if(cur.val==key){return true;}else{cur=cur.next;}}return false;}}@Overridepublic void remove(int key) {//1.先判斷鏈表是否為空if(head==null){return;}else{ListNode cur=head;while(cur!=null){if(cur.val==key){//1.考慮頭刪的情況if(cur==head){head=head.next;//考慮如果鏈表中只有一個節點的情況if(head!=null){head.prev=null;}}else{cur.prev.next=cur.next;//尾巴節點和中間節點共用if(cur.next==null){//尾節點last=last.prev;}else{//中間節點cur.next.prev=cur.prev;}}return;}cur=cur.next;}}}@Overridepublic void removeAllKey(int key) {if(head==null){return;}else{ListNode cur=head;while(cur!=null){if(cur.val==key){if(cur==head){head=head.next;//只有一個節點的情況要考慮if(head!=null){head.prev=null;}}else{cur.prev.next=cur.next;if(cur.next==null){last=last.next;}else{cur.next.prev=cur.prev;}}}cur=cur.next;}}}@Overridepublic int size() {if(head==null){return 0;}else{ListNode cur=head;int count=0;while(cur!=null){cur=cur.next;count++;}return count;}}@Overridepublic void display() {if(head==null){return;}else{ListNode cur=head;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}System.out.println();}}@Overridepublic void clear() {if(head==null){return;}else{ListNode cur=head;while(cur!=null){ListNode curN=cur.next;cur.prev=null;cur.next=null;cur=curN;}head=last=null;//最后要把head和last置為null}}
}
import utils.IndexException;public class Test {public static void main(String[] args) {LinkedList linkedList=new LinkedList();linkedList.addLast(1);linkedList.addLast(1);linkedList.addLast(1);linkedList.addLast(2);linkedList.display();
//        linkedList.addFirst(1);
//        linkedList.addFirst(2);
//        linkedList.addFirst(3);
//        linkedList.addFirst(4);
//        linkedList.display();
//        int ret=linkedList.size();
//        System.out.println(ret);
//        try{
//            linkedList.addIndex(2,100);
//
//        }catch (IndexException e){
//            e.printStackTrace();
//        }
//        linkedList.display();
//        linkedList.remove(1);
//        linkedList.display();
//        linkedList.removeAllKey(1);linkedList.clear();linkedList.display();}
}

結語?

本次分享到此結束啦。希望可以幫到有需要的人!

?

?

?

?

?

?

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

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

相關文章

如何檢查瀏覽器是否啟用了WebGL2.0硬件加速

一:WebGL Inspector使用 打開 Chrome 或 Edge(推薦使用 Chromium 內核瀏覽器)。 安裝插件: ?? Spector.js on Chrome Web Store 安裝完成后,在瀏覽器工具欄看到綠色的 S 圖標 二:捕獲 WebGL 渲染幀 打開你要分析的 Web3D 網站(比如 https://3dviewer.net)。 點擊瀏…

“時間”,在數據處理中的真身——弼馬溫一般『無所不能』(DeepSeek)

電子表格時間處理真理&#xff1a;數值存儲最瘦身&#xff0c;真身闖關通四海。 筆記模板由python腳本于2025-04-23 22:25:59創建&#xff0c;本篇筆記適合喜歡在電子表格中探求時間格式的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值&#xff1a;在于輸出思考與經驗…

AXOP39062: 25MHz軌到軌輸入輸出雙通道運算放大器

AXOP39062是用于低壓應用(1.5V~5.5V)的雙通道運算放大器&#xff0c;具有軌到軌的輸入輸出工作范圍&#xff0c;非常適合需要小尺寸、大容性負載驅動能力的低壓應用。產品具有25MHz的增益帶寬&#xff0c;具有優異的噪聲性能和極低的失真度。 主要特性 軌到軌的輸入輸出范圍低…

基于大模型的胃食管反流病全周期預測與診療方案研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、胃食管反流病概述 2.1 疾病定義與分類 2.2 流行病學特征 2.3 發病機制 三、大模型技術原理與應用基礎 3.1 大模型簡介 3.2 適用于胃食管反流病預測的大模型類型 3.3 數據收集與預處理 四、大模型在胃食…

西門子S7-200SMART 控制Profinet閉環步進MD-4250-PN (1)電機及專欄介紹

一、前言 本系列是我繼 《西門子S7-1200PLC 控制步進電機 MD-4240-PN》系列專欄后&#xff0c;新開的一篇專欄。 系列的主題圍繞 S7-200SMART Profinet閉環步進(MD-4250-PN) 觸摸屏的硬件&#xff0c;預計作四篇文章&#xff0c;分別為&#xff1a;專欄介紹、硬件介紹、PLC…

bedtools coverage 獲取每個位置的測序深度

1.bedtools 文檔 $ bedtools --version bedtools v2.31.1coverage Compute the coverage over defined intervals. Usage:bedtools coverage [OPTIONS] -a <FILE> \-b <FILE1, FILE2, ..., FILEN>(or):coverageBed [OPTIONS] -a <FILE> \-b <FILE1,…

反向代理和DDNS的區別是什么?

反向代理&#xff08;Reverse Proxy&#xff09;和動態域名解析&#xff08;DDNS&#xff0c;Dynamic Domain Name System&#xff09;是兩種不同的網絡技術&#xff0c;雖然它們都與外部訪問內部服務相關&#xff0c;但解決的問題和應用場景完全不同。具體區別如下&#xff1a…

縮放點積注意力

Scaled Dot-Product Attention 論文地址 https://arxiv.org/pdf/1706.03762 注意力機制介紹 縮放點積注意力是Transformer模型的核心組件&#xff0c;用于計算序列中不同位置之間的關聯程度。其核心思想是通過查詢向量&#xff08;query&#xff09;和鍵向量&#xff08;key&am…

可吸收聚合物:醫療科技與綠色未來的交匯點

可吸收聚合物&#xff08;Biodegradable Polymers&#xff09;作為生物醫學工程的核心材料&#xff0c;正引領一場從“金屬/塑料植入物”到“智能降解材料”的范式轉移。根據QYResearch&#xff08;恒州博智&#xff09;預測&#xff0c;2031年全球可吸收聚合物市場銷售額將突破…

房地產項目績效考核管理制度與績效提升

房地產項目績效考核管理制度的核心目的是通過合理的績效考核機制&#xff0c;提升項目的整體運作效率&#xff0c;并鼓勵項目團隊成員的積極性。該制度適用于所有房地產項目部工作人員&#xff0c;涵蓋了項目經理和項目成員的考核。考核的主要內容包括項目經理和項目部成員的工…

【算法筆記】動態規劃基礎(一):dp思想、基礎線性dp

目錄 前言動態規劃的精髓什么叫“狀態”動態規劃的概念動態規劃的三要素動態規劃的框架無后效性dfs -> 記憶化搜索 -> dp暴力寫法記憶化搜索寫法記憶化搜索優化了什么&#xff1f;怎么轉化成dp&#xff1f;dp寫法 dp其實也是圖論首先先說結論&#xff1a;狀態DAG是怎樣的…

pytorch 51 GroundingDINO模型導出tensorrt并使用c++進行部署,53ms一張圖

本專欄博客第49篇文章分享了將 GroundingDINO模型導出onnx并使用c++進行部署,并嘗試將onnx模型轉換為trt模型,fp16進行推理,可以發現推理速度提升了一倍。為此對GroundingDINO的trt推理進行調研,發現 在GroundingDINO-TensorRT-and-ONNX-Inference項目中分享了模型導出onnx…

一個關于相對速度的假想的故事-6

既然已經知道了速度是不能疊加的&#xff0c;同時也知道這個疊加是怎么做到的&#xff0c;那么&#xff0c;我們實際上就知道了光速的來源&#xff0c;也就是這里的虛數單位的來源&#xff1a; 而它的來源則是&#xff0c; 但這是兩個速度的比率&#xff0c;而光速則是一個速度…

深度學習激活函數與損失函數全解析:從Sigmoid到交叉熵的數學原理與實踐應用

目錄 前言一、sigmoid 及導數求導二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、極大似然估計與交叉熵損失函數8.1 極大似然估計與交叉熵損失函數算法理論8.1.1 伯努利分布8.1.2 二項分布8.1.3 極大似然估計總結 前言 書接上文 PaddlePaddle線性回歸詳解…

Python內置函數---breakpoint()

用于在代碼執行過程中動態設置斷點&#xff0c;暫停程序并進入調試模式。 1. 基本語法與功能 breakpoint(*args, kwargs) - 參數&#xff1a;接受任意數量的位置參數和關鍵字參數&#xff0c;但通常無需傳遞&#xff08;默認調用pdb.set_trace()&#xff09;。 - 功能&#x…

從零手寫 RPC-version1

一、 前置知識 1. 反射 獲取字節碼的三種方式 Class.forName("全類名") &#xff08;全類名&#xff0c;即包名類名&#xff09;類名.class對象.getClass() (任意對象都可調用&#xff0c;因為該方法來自Object類&#xff09; 獲取成員方法 Method getMethod(St…

ARINC818協議(六)

上圖中&#xff0c;紅色虛線上面為我們常用的simple mode簡單模式&#xff0c;下面和上面的結合在一起&#xff0c;就形成了extended mode擴展模式。 ARINC818協議 container header容器頭 ancillary data輔助數據 視頻流 ADVB幀映射 FHCP傳輸協議 R_CTRL:路由控制routing ctr…

PyCharm 鏈接 Podman Desktop 的 podman-machine-default Linux 虛擬環境

#工作記錄 PyCharm Community 連接到Podman Desktop 的 podman-machine-default Linux 虛擬環境詳細步驟 1. 準備工作 確保我們已在 Windows 系統中正確安裝并啟動了 Podman Desktop。 我們將通過 Podman Desktop 提供的名為 podman-machine-default 的 Fedora Linux 41 WSL…

小白自學python第一天

學習python的第一天 一、常用的值類型&#xff08;先來粗略認識一下~&#xff09; 類型說明數字&#xff08;number&#xff09;包含整型&#xff08;int&#xff09;、浮點型&#xff08;float&#xff09;、復數&#xff08;complex&#xff09;、布爾&#xff08;boolean&…

初階數據結構--排序算法(全解析!!!)

排序 1. 排序的概念 排序&#xff1a;所謂排序,就是使一串記錄&#xff0c;按照其中的某個或某些些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。 2. 常見的排序算法 3. 實現常見的排序算法 以下排序算法均是以排升序為示例。 3.1 插入排序 基本思想&#xff1a;…