鏈表(Linked list)是一種線性表數據結構。一般說鏈表的時候,會把它與數組放在一塊兒進行比較,這樣會更好的理解鏈表。鏈表克服了數組須要預先知道數據大小的缺點,而且它能夠充分利用好內存空間,經過「指針」將一組零散的內存塊串聯起來使用,實現靈活的內存動態管理。可是鏈表失去了數組隨機訪問優勢,同時鏈表因爲增長告終點的指針域,空間開銷比較大。數組
由於鏈表的存儲空間不是連續的,因此不像數組呢樣,每作一次插入刪除操做的時候,爲了保證內存數據的連續性,都須要作大量的數據遷移,也就意味着它的插入刪除操做是十分快速的。一般只須要考慮相鄰節點的指針的變化就能夠了,因此時間複雜度很低,爲O(1)。數據結構
固然有利就有弊。鏈表的隨機訪問效率就不如數組了。一樣緣由,非連續存儲,因此不能經過尋址公式來直接計算內存地址了。只能根據指針去一個節點一個節點的遍歷,時間複雜度要搞一些,爲O(n)。svg
單鏈表,雙向鏈表和循環鏈表。設計
單鏈表是最簡單的一種鏈表結構了,它包含兩個域,一個信息域和一個指針域。而且是單向,結點只有一個後繼指針 next 指向後面的結點。指針
雙向鏈表,顧名思義,它支持兩個方向,一個前驅指針prev指向前面的節點,一個後繼指針next指向後面的節點。同時它也比單鏈表更加佔內存,可是它更靈活,能夠雙向遍歷,因此對插入、刪除操做更加簡單、高效。cdn
JAVA的LinkedHashMap容器底層就是這個雙向鏈表。blog
循環鏈表,其實它是一種特殊的單鏈表。由於單鏈表的尾結點指針指向空地址,來表示結束。而循環鏈表的尾結點指針指向它的頭結點。換一種角度想,循環鏈表也能夠說是「無頭無尾」,它比單鏈表要稍微省內存一些。ip
定義:是一段地址連續的存儲單元依次存儲數據元素的線性結構 內存
優勢:存取速度高效,經過下標來直接存取 get
缺點:插入和刪除比較慢,不能夠實時增加長度
適用場景:適用於須要大量訪問元素的,而增長/刪除元素較少的程序
定義:一種鏈式存儲的線性表,用一組地址任意的存儲單元存放線性表的數據元素,稱爲存儲單元爲一個節點
優勢:插入和刪除速度快,保留原有的物理順序
缺點:查找元素須要遍歷,所以不支持隨機查找
適用場景:適用於須要頻繁進行增長/刪除元素,而查找元素較少的程序
在這裏能夠提一下一種設計思想:空間換時間。衆所周知,當空間充足的時候,咱們確定會更加追求代碼的執行效率,這個時候能夠優先考慮鏈表。相反,若是內存不充足,好比單片機、手機等等,在這種內存即金錢的時候,則時間換空間,這個時候能夠優先考慮數組。
總結: 數組查詢效率高效,插入、刪除操做效率低效,大小固定。鏈表查詢效率低,插入、刪除操做效率高效,沒有大小限制。
下一篇則是對於鏈表具體問題具體分析。
您的點贊和關注是對我最大的支持,謝謝!