LinkedList的模擬實現+LinkedList和ArrayList的區別

目錄

LinkedList的模擬實現

什么是雙向鏈表

增加數據

頭插法:

?尾插法:

指定的下標插入:

刪除數據

?刪除雙向鏈表中出現的第一個key

置空所有數據

LinkedList和ArrayList的區別


????????

順序表對應的集合類是ArrayList;鏈表對應的集合類是LinkedList,在Java集合框架中,它們是兩種最基礎也是最常用的數據結構實現,它們的底層實現原理和性能差異是怎么樣的呢?這里我們先來模擬實現LinkedList;

LinkedList的模擬實現

什么是雙向鏈表

????????首先,我們要知道的是LinkedList的底層使用了雙向鏈表,那么什么是雙鏈表呢?我們前面學過單鏈表是由一個個節點組成,節點中包括數據域和指針域的一個鏈表其中指針域存放著下一個節點的地址值:

????????雙向鏈表同樣也是由一個個節點組成,多了個prev指針,指向前驅節點的地址,和一個last指針指向最后一個節點;那么我們如何構建一個雙向鏈表呢?基于單鏈表的學習,雙向鏈表我們模仿單鏈表的樣式去寫就簡單很多了:

    //1.想構成鏈表的是?->節點由什么組成?定義變量 一個節點為一個對象定義成內部類static class ListNode{public int val;public ListNode next;public ListNode prev;//構造一個節點,只需要實例化public ListNode(int val) {this.val = val;}}//指向節點的一些指針public ListNode head;public ListNode last;//始終指向最后一個節點

?????????這樣寫好一個鏈表的基本結構我們就可以為這個鏈表寫一些操作方法了;雙向鏈表有一些操作時不太涉及prev指針域的,這些操作是跟前面學習的單鏈表一致的,比如:鏈表打印display、表長size、查找鏈表的元素contains、這里就不重復記錄了;具體看單鏈表的手動實現+相關習題,這里主要介紹與單鏈表有點區別的操作。

增加數據

頭插法:

    public void addFirst(int data) {//1.實例化一個節點ListNode node = new ListNode(data);//2.鏈表尾空if (head == null){head = node;last = node;}else {node.next = head;//先綁定后面head.prev = node;head = node;}return;}

雙向鏈表中有兩個指針域,操作節點是要尤其注意操作指針域的順序,要避免數據丟失的情況。?

?尾插法:

    public void addLast(int data) {ListNode node = new ListNode(data);if (head == null){head = node;last = node;}else {last.next = node;node.prev = last;last = node;//注意要更新last節點,保證last是最后一個節點}}

指定的下標插入:

????????在指定下標位置進行插入時,我們重點要關注的是中間插入元素是的操作順序

    public void addIndex(int index, int data) {ListNode node = new ListNode(data);//1.判斷index合法性if (index < 0 && index > size()){throw new IndexException("index非法" + index);}//2.index為0時,頭插if (index == 0){addFirst(data);return;}//index為size時,尾插if (index == size()){addLast(data);return;}//3.找indexListNode cur = findIndex(index);//注意順序node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}private ListNode findIndex(int index){ListNode cur = head;int count = 0;while (count != index){//因為是雙向鏈表,可以訪問到節點的前驅和后繼,所以不用跟單鏈表一樣找index-1cur = cur.next;count++;}return cur;}

刪除數據

?刪除雙向鏈表中出現的第一個key

注意:刪除時要考慮到所有特殊的情況,比如刪除頭結點、尾結點、鏈表只有一個節點的情況:

    public void remove(int key) {//遍歷找keyListNode cur = head;while (cur != null){if (cur.val == key ){//1.要刪的節點是頭結點if (cur == head){head = head.next;if (head != null){head.prev = null;}else {//鏈表只有一個節點且是需要刪除的節點,也得置空last = null;}return;}else {if (cur.next == null){//刪除尾結點cur.prev.next = null;last = last.prev;}else {//刪除中間節點cur.prev.next = cur.next;cur.next.prev = cur.prev;}}return;}cur = cur.next;}}

????????刪除第一個key值得代碼我們寫出來了,那么刪除所有key值也非常得簡單了,把return去掉讓他繼續往下遍歷往下刪除即可;

置空所有數據

????????我們可以直接簡單粗暴的分別把head和last置空,導致整個表置空;也可以把每個節點的指針域依次置空?,本質上兩種方法時一樣的:

    public void clear() {//循環把節點依次置空ListNode cur = head;while (cur != null){//定義一個指針指向即將被刪除的節點,記錄下下一個要被刪除的節點ListNode curNext = cur.next;cur.prev = null;cur.next = null;cur = curNext;}this.head = null;this.last = null;}

LinkedList和ArrayList的區別

存儲空間方面:

  • ArrayList物理存儲和邏輯順序都是連續的(基于動態數組實現)。

  • LinkedList邏輯上是連續的,但物理存儲不一定連續(基于雙向鏈表實現)。

查找修改效率:

  • ArrayList是數組結構,支持隨機訪問,可以直接通過索引定位元素,效率極高O(1);修改的第一步也是要訪問,所以修改的時間復雜度也為O(1)

  • LinkedList不支持隨機存取,必須從頭或尾遍歷鏈表,訪問效率較低O(n)

插入和刪除元素效率:

  • ArrayList?插入或刪除除了頭節點和尾結點元素時,需要移動后續所有元素,效率較低O(n)

  • LinkedList只需調整相鄰節點的指針,無需移動數據,效率更高O(1)

擴容機制:

  • ArrayList:采用靜態分配,初始容量固定,擴容時需要重新分配更大的數組并復制數據,時間復雜度 O(n)。可能導致空間浪費或頻繁擴容。

  • LinkedList:動態分配,每次插入新元素時才分配內存,無需擴容。沒有容量限制,但每個節點需要額外存儲指針,占用更多內存。

適用場景:

  • ArrayList:適合讀多寫少的場景,。

  • LinkedList:適合增刪頻繁的場景。


?感謝大家閱讀📚點贊👍收藏?評論?關注?

博客主頁: 【長毛女士-CSDN博客?

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

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

相關文章

Vue + WebSocket 實時數據可視化實戰:多源融合與模擬數據雙模式設計

在現代交通大屏項目中&#xff0c;實時數據的采集和可視化尤為重要。本文結合 Vue3 和 ECharts&#xff0c;分享一個支持多 WebSocket 數據源實時合并、模擬數據調試、自動重連的完整設計方案&#xff0c;幫助你快速搭建健壯的數據可視化組件。一、項目背景與核心需求實時接收多…

C#索引器、接口、泛型

以下是對提供的 C# 代碼中涉及的核心知識點的梳理和總結&#xff0c;涵蓋索引器、接口、泛型三大核心內容&#xff0c;以及相關實踐要點&#xff1a;一、索引器&#xff08;Indexer&#xff09;索引器是一種允許類或結構體像數組一樣通過[]語法訪問成員的特殊成員&#xff0c;本…

界面組件DevExpress WPF中文教程:Grid - 如何過濾節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Excel——INDEX和MATCH傻傻分不清?

核心邏輯?先用 MATCH 找到目標姓名在表格中的 ?行號&#xff0c;再用 INDEX 根據行號 ?提取對應信息。就像查字典&#xff1a;先用拼音找到字的頁碼&#xff08;MATCH 找行號&#xff09;再翻到該頁看具體解釋&#xff08;INDEX 取數據&#xff09;?分步拆解&#xff08;以…

制造業低代碼平臺實戰評測:簡道云、釘釘宜搭、華為云Astro、金蝶云·蒼穹、斑斑低代碼,誰更值得選?

上回聊了斑斑和簡道云&#xff0c;不少同行私信問我其他幾個低代碼平臺怎么樣&#xff0c;今天就給大家來個"五大門派"終極對決&#xff01; 一、先說痛點 制造業搞數字化最怕三件事&#xff1a; 1.錢花了沒效果&#xff08;大平臺用不起&#xff0c;小工具不夠用&…

Jenkins中HTML文件顯示樣式問題解決方案

Jenkins中HTML文件顯示樣式問題解決方案 問題描述 在Jenkins中歸檔的HTML文件顯示格式失效&#xff0c;樣式無法正常顯示&#xff0c;但在本地瀏覽器中打開卻能正常顯示。 問題原因 Jenkins為了安全考慮&#xff0c;默認設置了嚴格的內容安全策略(Content Security Policy, CSP…

四、配置文件

文章目錄1. 文件類型1.1 properties1.2 yaml1.2.1 簡介1.2.2 基本語法1.2.3 數據類型1.2.4 示例2. 配置提示1. 文件類型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 簡介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一種標記語言&#x…

Python常用醫療AI庫以及案例解析(場景化進階版)

?? 框架應用拓撲圖用例 #mermaid-svg-lZ1J5KCaVWBV2kAu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-icon{fill:#552222;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-text{fill:#552222;st…

Python高效操作Kafka實戰指南

Python操作Kafka的高效 以下是使用Python操作Kafka的高效消息發送實例,涵蓋基礎發送、批量處理、異步回調等場景。示例基于confluent-kafka庫(推薦)和kafka-python庫,代碼均經過實測。 流程圖 基礎消息發送(同步) from confluent_kafka import Producerproducer = Pro…

離線快速處理PDF格式轉化的方案

日常辦公中&#xff0c;PDF 幾乎成了我們離不開的文件格式。然而像 WPS 這樣的工具&#xff0c;不少實用功能都需要額外付費才能解鎖。它的打開方式很簡單&#xff0c;雙擊桌面圖標即可運行。它不會彈出主界面&#xff0c;而是默默駐留在系統托盤區&#xff0c;需要時雙擊圖標就…

SpringMVC注解與SpringCloudOpenFeign注解對比

1. 背景知識 梳理SpringMVC和SpringCloudOpenFeign常用注解后&#xff1a; Spring MVC中常用注解_筆記-CSDN博客Spring Cloud OpenFeign 常用注解_筆記-CSDN博客 這里對兩類注解做個對比。理解兩者定位&#xff08;服務端 vs 客戶端&#xff09;是掌握注解使用的關鍵&#x…

Linux 時間同步的流程

一、問題時間RTC時間、系統時間(UTC)和本地時間的關系如下&#xff1a;?RTC時間?&#xff08;硬件時鐘&#xff09;&#xff1a;顯示為UTC時間格式&#xff1a;02:50:35/02:51:28由主板電池供電&#xff0c;獨立于系統運行?12通常存儲UTC時間&#xff08;Linux默認配置&…

VSCode——python選擇解釋器消失的解決辦法

VSCode軟件的左下角 設置——檢查更新&#xff1a;

笛卡爾積規避:JOIN條件完整性檢查要點

笛卡爾積是數據庫查詢中的高風險操作&#xff0c;多表JOIN時缺失有效關聯條件會導致結果集指數級膨脹&#xff0c;引發?性能塌方?甚至系統崩潰?。以下是核心檢查策略及防御方案&#xff1a;一、笛卡爾積的致命影響??性能塌方?百萬級訂單表與千萬級用戶表缺失ON條件時&…

Vimba相機二次開發教程,基于Python

文章目錄安裝獲取圖像輔助數據Vimba 是由 Allied Vision 開發的一套軟件開發套件&#xff08;SDK&#xff09;&#xff0c;主要用于控制和操作其工業相機產品。它提供了一套完整的 API 和工具&#xff0c;支持多種操作系統和編程語言&#xff0c;便于開發者快速集成相機功能到應…

電子測試行業軟件ATECLOUD與ETEST對比分析-納米軟件

在當今科技飛速發展的時代&#xff0c;電測行業對于自動化測試平臺的依賴程度日益加深。高效、精準的自動化測試平臺不僅能夠提升測試效率&#xff0c;還能確保產品質量。ATECLOUD 與 ETEST 作為電測行業中頗受矚目的自動化測試平臺&#xff0c;各自展現出獨特的優勢與特點。下…

自動化測試中的常見測試方法

自動化測試中的常見測試方法在自動化測試中&#xff0c;除了數據驅動&#xff08;Data-Driven Testing&#xff09;&#xff0c;還有多種主流方法&#xff0c;每種方法適用于不同場景和需求。以下是常見的自動化測試方法分類及詳解&#xff1a;一、關鍵字驅動測試&#xff08;K…

口語01-don‘t judge a book by its cover

Dont judge a book by its cover 不要以貌取人1 the most advanced thing2 stack3 right4 frantically5 be annoyed with sb6 Get your stuff off my desk7 But today I came to class and was running a few minutes late.8 take my seat&#xff1a;占我座位 / 坐我的位置9 s…

《Uniapp-Vue 3-TS 實戰開發》自定義預約時間段組件

這個組件可以直接在 uniapp 項目中使用,提供了 24 小時時段選擇功能,支持單選 / 多選、預設時段選擇、隨機選擇等功能。 html版本: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="vi…

《Uniapp-Vue 3-TS 實戰開發》自定義環形進度條組件

引言 在UniApp中使用Vue3和TypeScript開發環形進度條組件,我們可以考慮三種技術:Canvas、SVG和純HTML(利用CSS)。考慮到兼容性、實現難度和效果,SVG是較好的選擇。它可以輕松實現環形進度條,支持漸變色,并且可以通過屬性精確控制進度,同時在不同分辨率屏幕上清晰顯示…