Java_LinkedList鏈表詳解

目錄

前言

ArrayList的缺陷

鏈表?

鏈表的概念及結構

鏈表的種類

1.單向或雙向

2.帶頭或不帶頭

3.循環或不循環

LinkedList的使用?

什么是LinkedList

LinkedList的使用

LinkedList的構造

LinkedList的其他常用方法介紹

LinkedList的遍歷

ArrayList和LinkedList的區別

鏈表的缺陷?


?

前言

圖文詳解java鏈表,順序表和鏈表的比較,多種鏈表的形式,鏈表的使用,鏈表的方法

ArrayList的缺陷

ArrayList順序表

由于其底層是一段連續空間,當在ArrayList任意位置插入或者刪除元素時,就需要將后序元素整體往前或者往后 搬移,時間復雜度為O(n),效率比較低,因此ArrayList不適合做任意位置插入和刪除比較多的場景。因此:java 集合中又引入了LinkedList,即鏈表結構。

鏈表?

鏈表的概念及結構

鏈表是一種物理存儲結構上非連續存儲結構,數據元素的邏輯順序是通過鏈表中的引用鏈接次序實現的 。

由上圖可見鏈表不同于數組,刪除和添加元素只需要把next的值改變即可

這樣時間復雜度只為O(1)

例如:?

?

注意:

? ? ? ? 1.從上圖可看出,鏈式結構在邏輯上是連續的,但是在物理上不一定連續

? ? ? ? 2.現實中的結點一般都是從堆上申請出來的

? ? ? ? 3.從堆上申請的空間,是按照一定的策略來分配的,兩次申請的空間可能連續,也可能不連續

鏈表的種類

1.單向或雙向

?

2.帶頭或不帶頭

3.循環或不循環

?

雖然有這么多的鏈表的結構,但是我們重點掌握兩種:

無頭單向非循環鏈表:結構簡單,一般不會單獨用來存數據。實際中更多是作為其他數據結構的子結構,如 哈希桶、圖的鄰接表等等。另外這種結構在筆試面試中出現很多。

無頭雙向鏈表:在Java的集合框架庫中LinkedList底層實現就是無頭雙向循環鏈表。

LinkedList的使用?

什么是LinkedList

LinkedList的底層是雙向鏈表結構(鏈表后面介紹),由于鏈表沒有將元素存儲在連續的空間中,元素存儲在單獨的節 點中,然后通過引用將節點連接起來了,因此在在任意位置插入或者刪除元素時,不需要搬移元素,效率比較高。

LinkedList的使用

LinkedList的構造

?

public static void main(String[] args) {// 構造一個空的LinkedListList<Integer> list1 = new LinkedList<>();List<String> list2 = new java.util.ArrayList<>();list2.add("JavaSE");list2.add("JavaWeb");list2.add("JavaEE");// 使用ArrayList構造LinkedListList<String> list3 = new LinkedList<>(list2);
}

LinkedList的其他常用方法介紹

public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1); // add(elem): 表示尾插list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println(list.size());System.out.println(list);// 在起始位置插入0list.add(0, 0); // add(index, elem): 在index位置插入元素elemSystem.out.println(list);list.remove(); // remove(): 刪除第一個元素,內部調用的是removeFirst()list.removeFirst(); // removeFirst(): 刪除第一個元素list.removeLast(); // removeLast(): 刪除最后元素list.remove(1); // remove(index): 刪除index位置的元素System.out.println(list);// contains(elem): 檢測elem元素是否存在,如果存在返回true,否則返回falseif(!list.contains(1)){list.add(0, 1);}list.add(1);System.out.println(list);System.out.println(list.indexOf(1)); // indexOf(elem): 從前往后找到第一個elem的位置System.out.println(list.lastIndexOf(1)); // lastIndexOf(elem): 從后往前找第一個1的位置int elem = list.get(0); // get(index): 獲取指定位置元素list.set(0, 100); // set(index, elem): 將index位置的元素設置為elemSystem.out.println(list);// subList(from, to): 用list中[from, to)之間的元素構造一個新的LinkedList返回List<Integer> copy = list.subList(0, 3); System.out.println(list);System.out.println(copy);list.clear(); // 將list中元素清空System.out.println(list.size());
}

LinkedList的遍歷

public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1); // add(elem): 表示尾插list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println(list.size());// foreach遍歷for (int e:list) {System.out.print(e + " ");}System.out.println();// 使用迭代器遍歷---正向遍歷ListIterator<Integer> it = list.listIterator();while(it.hasNext()){System.out.print(it.next()+ " ");}System.out.println();// 使用反向迭代器---反向遍歷ListIterator<Integer> rit = list.listIterator(list.size());while (rit.hasPrevious()){System.out.print(rit.previous() +" ");}System.out.println();
}

ArrayList和LinkedList的區別

鏈表的缺陷?

我們知道鏈表的刪除和添加效率比順序表高得多,但是沒有取代順序表,這是因為鏈表也有缺陷

如上圖,鏈表對于訪問來說非常的乏力,順序表底層是數組,可以直接用下標來訪問,時間復雜度為O(1),而鏈表則需要從頭開始訪問,一個個計數然后訪問到需要的元素,時間復雜度為O(n)?

所以順序表和鏈表都有其存在的意義,我們要視情況而選擇合適的來使用?

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

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

相關文章

OpenCL學習筆記(四)手動編譯開發庫(ubuntu+gcc+rk3588)

前言 筆者本次使用的是RK3588的開發板&#xff0c;內部燒寫的是ubuntu20.04&#xff0c;gcc版本是9 本文檔簡單記錄下編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、安裝所需軟件 1.安裝git&#xff0c;教程比較多&#xff0c;不再重復 2.安裝cmake&#xff0c;教程…

UWB的matlab仿真源碼

作品詳細文章與下載鏈接 第一部分:TR-UWB信號的產生和調制 簡介 該實踐涉及使用 MATLAB 生成和調制 TR-UWB 信號。超寬帶信號是一類在頻譜中具有寬帶而不是窄帶的信號信號&#xff0c;具有時間寬度的脈沖產生它。在本次實踐中,MATLAB 程序是開發用于生成基帶 TR-UWB 信號,我們用…

在Windows電腦上獲取硬盤ID的方法

如果你想在Windows電腦上獲取硬盤的ID&#xff0c;可以使用DiskPart命令。以下是具體步驟&#xff1a; 打開命令提示符 按下Win鍵R&#xff0c;輸入cmd&#xff0c;然后回車&#xff0c;即可打開命令提示符。 輸入diskpart并回車 在命令提示符中輸入diskpart&#xff0c;然后…

WordPress 注冊/重置密碼/更改密碼鉤子

wordpress在提供郵件提醒的地方都留了hook&#xff0c;方便讓開發者自定義。最新在添加第三方登錄時遇到虛擬郵箱發信問題&#xff0c;為了防止給指定郵件地址后綴發信&#xff0c;可以利用如下wordpress提供的鉤子來實現。 //https://www.wwttl.com/101.html //禁止用戶注冊時…

用23種設計模式打造一個cocos creator的游戲框架----(十)迭代器模式

1、模式標準 模式名稱&#xff1a;迭代器模式 模式分類&#xff1a;行為型 模式意圖&#xff1a;提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;且不需要暴露該對象的內部表示. 結構圖&#xff1a; ? 適用于&#xff1a; 1、當你需要遍歷一個復雜的數據結構…

promethesu告警規則配置,alertmanager通過webhook通知

文章目錄 前言一、promethesu告警二、告警配置編寫rule文件prometheus配置prometheus產生告警 三、告警通知prometheus 配置 alertmanageralertmanager 配置 webhook通知編寫接口接收 webhook 總結 前言 如果沒有學習過prometheus的基礎和監控的同學&#xff0c;可以先過一遍這…

融合科技,升級醫療體驗——醫院陪診服務的技術創新

隨著科技的迅猛發展&#xff0c;醫療服務領域也在積極借助技術手段提升患者體驗。本文將探討如何利用先進的技術代碼&#xff0c;將醫院陪診服務推向新的高度。 1. 醫療預約系統的實現 # 通過Python代碼實現醫療預約系統 class MedicalAppointment:def __init__(self, patie…

【Python】Numpy庫近50個常用函數詳解和示例,可作為工具手冊使用

本文以yolo系列代碼為基礎&#xff0c;在其中查找用到的numpy函數&#xff0c;包含近50個函數&#xff0c;本文花費多天&#xff0c;三萬多字&#xff0c;通過豐富的函數原理和示例對這些函數進行詳解。以幫助大家理解和使用。 目錄 np.array()運行示例 np.asarray()函數解析運…

unity 2d 入門 飛翔小鳥 場景延續(八)

1、新建c#腳本如下 代碼&#xff0c;在前方生成生成自身圖片并3s后銷毀自身&#xff0c;在碰撞物體后小鳥死亡后不刪除自身 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CopyScene : MonoBehaviour { //要復制的對象public…

Amazon CodeWhisperer 提供新的人工智能驅動型代碼修復、IaC 支持以及與 Visual Studio 的集成...

Amazon CodeWhisperer 的人工智能&#xff08;AI&#xff09;驅動型代碼修復和基礎設施即代碼&#xff08;IaC&#xff09;支持已正式推出。Amazon CodeWhisperer 是一款用于 IDE 和命令行的人工智能驅動型生產力工具&#xff0c;現已在 Visual Studio 中推出&#xff0c;提供預…

uniapp封裝websocket文件(app、h5兼容)

適合場景&#xff1a;只需要發送一次數據&#xff0c;服務器可以實時返回數據進行渲染。 socket文件 let isSocketClose false; // 是否關閉socket let reconnectCount 5; // 重連次數 // let heartbeatInterval ""; // 心跳定時器 let socketTask null; // web…

uniapp實戰 —— 開發微信小程序的調試技巧

手機真機調試微信小程序 開發版和體驗版的小程序&#xff0c;域名沒有備案時想調試接口訪問效果&#xff0c;可以按下述方式操作&#xff1a; 在手機上點右上方三個點&#xff0c;點擊“開發調試”&#xff0c;開啟調試模式&#xff0c;即可真機訪問接口&#xff08;跳過域名校…

《C++新經典設計模式》之第21章 解釋器模式

《C新經典設計模式》之第21章 解釋器模式 解釋器模式.cpp 解釋器模式.cpp #include <iostream> #include <map> #include <stack> #include <vector> #include <cstring> #include <memory> #include <set> #include <sstream&g…

【Vue3從入門到項目實現】RuoYi-Vue3若依框架前端學習——動態路由與菜單欄

菜單欄 若依框架的側邊欄組件通常由菜單項和子菜單組成。 登錄后&#xff0c;會獲取用戶擁有的路由菜單 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…

第一百九十六回 通過藍牙發送數據的細節

文章目錄 1. 概念介紹2. 實現方法3. 代碼與效果3.1 示例代碼3.2 運行效果4. 經驗總結我們在上一章回中介紹了"分享三個使用TextField的細節"沉浸式狀態樣相關的內容,本章回中將介紹SliverList組件.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 通過藍牙設備…

[原創]C++98升級到C++20的復習旅途-個人感覺std::string_literals這個東西實現的不太人性化.

[簡介] 常用網名: 豬頭三 出生日期: 1981.XX.XX QQ聯系: 643439947 個人網站: 80x86匯編小站 https://www.x86asm.org 編程生涯: 2001年~至今[共22年] 職業生涯: 20年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、D…

git操作:使用vscode集成

git操作方式 其實git操作一般有三種方式 分別是終端命令行,開發工具集成,專業的git可視化工具 我前面幾章說的都是git的命令行操作,今天這篇文章主要是針對開發工具vscode集成git操作進行演示 說明一下,這里之所以選擇vscode,是因為本人用的就是vscode,每個開發工具基本都有…

最新PyTorch機器學習與深度學習實踐技術應用

近年來&#xff0c;隨著AlphaGo、無人駕駛汽車、醫學影像智慧輔助診療、ImageNet競賽等熱點事件的發生&#xff0c;人工智能迎來了新一輪的發展浪潮。尤其是深度學習技術&#xff0c;在許多行業都取得了顛覆性的成果。另外&#xff0c;近年來&#xff0c;Pytorch深度學習框架受…

mysql怎么優化查詢?

從多個維度優化&#xff0c;這里的優化維度有四個&#xff1a;硬件配置、參數配置、表結構設計和SQL語句及索引。 其中 SQL 語句相關的優化手段是最為重要的。 一、硬件配置 硬件方面的優化可以有 對磁盤進行擴容、將機械硬盤換為SSD&#xff0c;或是把CPU的核數往上提升一些…

IDEA中,Archetype的作用

在IntelliJ IDEA中&#xff0c;Archetype&#xff08;原型&#xff09;是一種用于創建項目的模板&#xff0c;它定義了項目的基本結構和初始文件。Archetype允許您通過預先構建好的項目框架來快速創建項目&#xff0c;從而節省了手動創建項目所需的時間和精力。 使用Archetype…