Java集合:關于 LinkedList 的內容盤點

本篇內容包括:LinkedList 的概述、LinkedList 的結構既雙向鏈表實現與LinkedList-Node 結構、LinkedList 的使用(構造方法&常用方法)、關于 Queue 隊列的介紹、關于 ArrayList 和 LinkedList 的區別以及算法:翻轉鏈表!

一、LinkedList 概述

LinkedList 是用鏈表作為數據存儲結構的 List 集合,鏈表數據結構的特點是每個元素分配的空間不必連續,因此鏈表很適合數據的動態插入和刪除,但是其隨機訪問和遍歷速度比較慢。另外,LinkedList還提供了 List 接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。

LinkedList 是以鏈表實現的,插入、刪除時只需要改變前后兩個節點指針指向即可,實現了真正的動態,不需要處理固定容量的問題,但是喪失了隨機訪問的能力 (索引訪問)。

LinkedList 是一個雙向鏈表實現,插入、刪除時只需要改變前后兩個節點指針指向即可,實現了真正的動態,不需要處理固定容量的問題。LinkedList 在當數據量很大或者操作很頻繁的情況下,添加和刪除元素時具有比 ArrayList 更好的性能。但在元素的查詢和修改方面要弱于ArrayList。

LinkedList 與 ArrayList 一樣 LinKedList 也不是線程安全的。


二、LinkedList 的結構

1、雙向鏈表實現

LinKedList 的數據存儲是基于雙向鏈表實現。

LinkedList 類每個結點用內部類 Node 表示,LinkedList 通過 firstlast 引用分別指向鏈表的第一個和最后一個元素,當鏈表為空時,firstlast 都為 NULL 值。

LinkedList

關于 LinKedList 操作數據時:

  • 插入數據(很快):先是在雙向鏈表中找到要插入節點的位置 index,找到之后,再插入一個新節點。 雙向鏈表查找 index 位置的節點時,有一個加速動作:若 index < 雙向鏈表長度的 1/2,則從前向后查找,否則,從后向前查找;
  • 刪除數據(很快):先是在雙向鏈表中找到要插入節點的位置 index,找到之后,進行如下操作:node.previous.next = node.next; node.next.previous = node.previous; node = null ,查找節點過程和插入一樣;
  • 獲取數據(很慢):每次獲取數據都需要從 Head 節點從頭開始查找;
  • 遍歷數據(很慢):同獲取數據一樣,每次遍歷數據都需要從頭開始。

2、LinkedList-Node 結構

LinkedList 類內部的 Node 結點代碼如下:

    private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}

Node 節點一共有三個屬性:item 代表節點值,prev 代表節點的前一個節點,next 代表節點的后一個節點。每個結點都有一個前驅和后繼結點,并且在 LinkedList 中也定義了兩個變量分別指向鏈表中的第一個和最后一個結點。


三、LinkedList 的使用

1、構造方法

方法名方法說明
public LinkedList()此構造函數用于構造一個空列表。
public LinkedList(Collection<? extends E> c)此構造函數將按照集合的迭代器返回的順序構造一個包含指定集合元素的列表

2、常用方法_作為隊列(Linked繼承了Queue)

方法名方法說明
boolean add(E e)此方法將指定的元素追加到此列表/隊列的末尾
E remove()此方法檢索并刪除此列表的頭部(第一個元素),如果此列表為空,則報錯
E removeFirst()此方法刪除并返回此列表中的第一個元素,如果此列表為空,則報錯
E removeLast()此方法檢索并刪除此列表的最后一個元素,如果此列表為空,則報錯
E poll()此方法檢索并刪除此列表的頭部(第一個元素)
E pollFirst()此方法檢索并刪除此列表的第一個元素,如果此列表為空,則返回null
E pollLast()此方法檢索并刪除此列表的最后一個元素,如果此列表為空,則返回null
E element()此方法檢索但不刪除此列表的頭部(第一個元素)

3、常用方法_作為棧(FILO 先進后出的棧)

方法名方法說明
void push(E e)此方法將元素推送到此列表所表示的堆棧上
E pop()此方法從此列表表示的堆棧中彈出一個元素
E peek()此方法檢索但不刪除此列表的頭部(第一個元素)
E peekFirst()此方法檢索但不刪除此列表的第一個元素,如果此列表為空,則返回null
E peekLast()此方法檢索但不刪除此列表的最后一個元素,如果此列表為空,則返回null

4、常用方法_作為鏈表

方法名方法說明
void add(int index, E e)此方法將指定的元素插入此列表中的指定位置。
E remove(int index)此方法刪除此列表中指定位置的元素
E remove(Object o)此方法從該列表中刪除指定元素的第一個匹配項(如果存在)
E set(int index, E e)此方法使用指定的元素替換此列表中指定位置的元素
E get(int index)此方法返回此列表中指定位置的元素
E getFirst()此方法返回此列表中的第一個元素
E getLast()此方法返回此列表中的最后一個元素
int size()此方法返回此列表中的元素數
boolean contains(Object o)如果此列表包含指定的元素,則此方法返回true
boolean isEmpty()如果此列表為空,則此方法返回true
int indexOf(Object o)此方法返回此列表中第一次出現的指定元素的索引,如果此列表不包含該元素,則返回-1
int lastIndexOf(Object o)此方法返回此列表中指定元素最后一次出現的索引,如果此列表不包含該元素,則返回-1
void clear()此方法將從此列表中刪除所有元素
Object clone()此方法返回返回此LinkedList的淺表副本
Object[] toArray()此方法以適當的順序(從第一個元素到最后一個元素)返回包含此列表中所有元素的數組
<T> T[] toArray(T[] a)此方法以適當的順序(從第一個元素到最后一個元素)返回包含此列表中所有元素的數組,返回數組的運行時類型是指定數組的運行時類型

四、相關知識點

1、關于 Queue 隊列

隊列(Queue):也是一種操作受限的線性表,只允許在表的一端進行插入,而在表的另一端進行刪除。向隊列中插入元素稱為入隊或進隊;刪除元素稱為出隊或離隊。

FIFO 隊列

這和我們日常生活中的排隊是一致的,最早排隊的也是最早離隊的。其操作的特性是先進先出(First In First Out, FIFO),故又稱為先進先出的線性表。基本上,一個隊列就是一個先入先出(FIFO)的數據結構

在Java 中 Queue 接口與 List、Set 同一級別,都是繼承了 Collection 接口。LinkedList 實現了 Deque 接口。

2、關于 ArrayList 和 LinkedList 的區別

在結構上,ArrayList 底層是數組,在內存上是連續的;LinkedList 底層是雙向鏈表,在內存上是不連續的

在性能上,ArrayList 由于內存上連續,支持隨機查詢,查詢速度更快,但是在增刪時由于會涉及到,數據的移動和數組的擴容,往往是要慢于 LinkedList 的,但并不絕對,可以提前設置好足夠的數組空間,并采用尾插的方式

3、算法:翻轉鏈表

假設鏈表為 1→2→3→?,我們想要把它改成 ?←1←2←3。

在遍歷鏈表時,將當前節點的 next 指針改為指向前一個節點。由于節點沒有引用其前一個節點,因此必須事先存儲其前一個節點。在更改引用之前,還需要存儲后一個節點。最后返回新的頭引用。

class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}
}

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

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

相關文章

shell自動化巡檢

#!/bin/bash #主機信息每日巡檢IPADDR$(ifconfig eth0|grep inet addr|awk -F [ :] {print $13}) #環境變量PATH沒設好&#xff0c;在cron里執行時有很多命令會找不到 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source /etc/profile…

Java集合:關于 Vector 的內容盤點

Vector 與 ArrayList 一樣&#xff0c;也是通過數組實現的&#xff0c;不同的是它支持線程的同步&#xff0c;即某一時刻只有一個線程能夠寫 Vector&#xff0c;避免多線程同時寫而引起的不一致性&#xff0c;但實現同步需要很高的花費&#xff0c;因此&#xff0c;訪問它比訪問…

memcached 的基本命令

memcached 的基本命令(安裝、卸載、啟動、配置相關)&#xff1a; -p 監聽的端口 -l 連接的 IP 地址, 默認是本機 -d start 啟動 memcached 服務 -d restart 重起 memcached 服務 -d stop|shutdown 關閉正在運行的 memcached 服務 -d install 安裝 memcached 服務 -d uninstall …

Java集合:關于 HashSet 的內容盤點

哈希表存放的是哈希值&#xff0c; HashSet 存儲元素的順序并不是按照存入時的順序&#xff08;和 List 顯然不同&#xff09; 而是按照哈希值來存的所以取數據也是按照哈希值取得。 &#xff5e; 本篇內容包括&#xff1a;HashSet 概述、HashSet 與 HashMap 的關系以及HashSet…

mysql備份腳本

#!/bin/bash #保留備份個數&#xff0c;會刪除時間較早的.dump備份 number3 #設置備份保存路徑&#xff0c;yourpath替換成自己的備份保存路徑 backup_diryourpath #日期格式 dddate %Y%m%d #備份工具 toolmysqldump #數據庫用戶名 usernameroot #數據庫密碼&#xff0c;由于密…

Java集合:關于 TreeSet 的內容盤點

TreeSet() 是使用二叉樹的原理對新 add() 的對象按照指定的順序排序&#xff08;升序、降序&#xff09;&#xff0c;每增加一個對象都會進行排序&#xff0c;將對象插入的二叉樹指定的位置&#xff1b; ~ 本篇內容包括&#xff1a;TreeSet 概述、TreeSet 的使用以及其他知識點…

python求素數

口求100內的素數 -個數能被從2開始到自己的平發根的正整數整數整除,就是合數 import math n100 for X in range(2, n): for i in range(2, math.ceil(math.sqrt(x))): if x %i 0: break else: print(x)口求100內的素數 合數一定可以分解為幾個質數的乘積 import math n100 pri…

svn鉤子腳本

REP0S"$1" REV"$2"export LANGen_US.UTF-8 LOGPATH"/app/log" [ !-d ${LOGPATH}] && mkdir $[LOGPATH) -p #update content from svn↓14 SVN/usr/bin/svn↓ SVN update --username test --password test /data/ if[ $? -eq ] then /us…

shell判斷字符串是否為數字

#1.組合語法判斷1: [ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g"] &&\echo”兩個參數都必須為數字”&& exit 1#2.組合語法判斷2:[ -n "echo $num|sed s/[0-9]//g" -a -n "echo $2|sed s/[0-9]//g&…

MySQL:DQL 數據查詢語句盤點

本篇內容包括&#xff1a;DQL 的簡介、SELECT 語句、WHERE 條件語句、JOIN 連接查詢(多表查詢)和分組、過濾、排序、分頁、子查詢的使用。 一、DQL 簡介 DQL&#xff08;Data QueryLanguage&#xff09;語句&#xff0c;即數據查詢語句 常用的語句關鍵字有&#xff1a;SELECT…

MySQL:DML 數據操作語句盤點

本篇內容包括&#xff1a;DML 的簡介、INSERT 命令、UPDATE 命令、DELETE 命令以及 TRUNCATE 命令的使用。 一、DML 簡介 DML&#xff08;Data Manipulation Language&#xff09;語句&#xff0c;即數據操作語句&#xff0c;用于操作數據庫對象中所包含的數據。 常用關鍵字包…

MySQL:DDL 數據定義語句盤點

本篇內容包括&#xff1a;DDL 的簡介、SHOW 查看語句、CREATE 創建語句、ALTER 修改語句以及 DROP 刪除語句的使用。 一、DDL 簡介 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;即數據定義語句&#xff0c;功能就是定義數據庫DATabase、表table、索引ind…

MySQL:DCL 數據控制語句盤點

本篇內容包括:DCL 簡介、GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT、LOCK命令的使用。 一、DCL 簡介 DCL&#xff08;Data Control Language&#xff09;語句&#xff0c;即數據控制語句&#xff0c;用于設置或更改數據庫用戶或角色權限的語句 常用關鍵字包括&#xff1a;…

oracle遷移父子數據

現有需求如下&#xff0c;業務組織單元表中id字段數據在另外一個系統全部重復&#xff0c;但需要將此業務單元組織導入另一系統 業務組織單元表Isc_Specialorg_Unit 表中存在ID字段為子節點數據&#xff0c;parent_id為父節點數據&#xff0c;orgpath為組織路徑 現在做如下操…

批量更新數據庫數據

"update isc22.isc_user t set t.saphrid "&E1&"where t.id "&B1&";"

oracle控制文件

控制文件是數據庫里面非常重要的一類文件,它記錄了當前實例連接的數據庫的結構和行為&#xff0c;并維護數據庫的一致性。 初始化參數文件中描述其位置&#xff0c;很小的:二進制文件,一般不要超過100mmount讀open一直在用 控制文件只能連接一個database丟失要恢復 …

oracle表空間

概念 表空間和數據文件 ●表空間是邏輯存儲概念&#xff0c;一個表空間是一個或多個數據文件的邏輯集合 ●存儲對象(表、索引)邏輯的存儲在表空間上&#xff0c;而存儲對象的數據物理的存放在數據文件上 ●數據庫至少需要一個叫做system的表空間&#xff0c;也就是系統表空間 ●…

oracle日志

日志分類 redo log files聯機日志或重做日志 archived log files歸檔日志 1184198alert log files 告警日志 trace files user_ _dump_ _dest 用戶信息日志如跟蹤會話日志 background dump_ dest進程日志還有其他一-些不常用的日志 v$database的log_mode 數據庫歸檔模式…

MySQL:分庫分表知識點盤點

本篇內容包括&#xff1a;數據庫瓶頸、分庫分表以及分庫分表相關問題 一、數據庫瓶頸 不管是IO瓶頸&#xff0c;還是CPU瓶頸&#xff0c;最終都會導致數據庫的活躍連接數增加&#xff0c;進而逼近甚至達到數據庫可承載活躍連接數的閾值。在業務Service來看就是&#xff0c;可用…

oracle的sga

sga SGA的管理 ■有三種方式&#xff1a; ●8i:SGA的總大小由所有內存組件大小之和決定&#xff0c;不能直接定義SCA大小。對內部組件大小的修改必須在數據庫重起 后 才能生為&#xff0c;所以叫做SGA的靜態管理。 ●9i&#xff…