維基百科:鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,可是並不會按線性的順序存儲數據,而是在每個節點裏存到下一個節點的指針(Pointer)。因爲沒必要須按順序存儲,鏈表在插入的時候能夠達到O(1)的複雜度,比另外一種線性表順序錶快得多,可是查找一個節點或者訪問特定編號的節點則須要O(n)的時間,而順序表相應的時間複雜度分別是O(logn)和O(1)。html
爲了更好的理解鏈表,咱們拿數組來做對比。數組
相比數組,鏈表是一種稍微複雜一點的數據結構。從底層的存儲結構上來看:數組須要一起連續的內存空間,堆內存的要求比較高,若是咱們申請一個100MB大小的數組,當內存中沒有連續的、足夠大的空間的時候,即使內存的剩餘總可用空間大於100MB,仍然會申請失敗;而鏈表偏偏相反,它並不須要一起連續的內存空間,它經過「指針」將一組零散的內存塊串聯起來,因此若是咱們申請100MB大小的鏈表,若是沒有100MB連續的內存空間,且內存的剩餘總可用空間大於100MB,根本不會有問題。數據結構
使用鏈表結構能夠克服數組鏈表須要預先知道數據大小的缺點,鏈表結構能夠充分利用計算機內存空間,實現靈活的內存動態管理。可是鏈表失去了數組隨機讀取的優勢,同時鏈表因爲增長告終點的指針域,空間開銷比較大。yii
鏈表的基本結構以下:指針
鏈表結構五花八門,可是咱們只介紹最經常使用的三種,分別是:單向鏈表,單向循環鏈表,雙向循環鏈表。
(若是你想進一步瞭解這些結構,能夠點擊下方的傳送門)htm
因爲在鏈表中,僅僅只有頭節點和尾節點是可見的,所以要想查找某個節點,必須從頭節點或尾節點一路找下去,時間複雜度至少爲O(logn) (二分),不如數組快。blog
... | 數組 | 鏈表 |
---|---|---|
訪問 | O(1) | O(N) |
搜索 | O(N) | O(N) |
插入 | O(N) | O(1) |
刪除 | O(N) | O(1) |
實際上,鏈表插入和刪除元素的時間複雜度均爲O(N)。爲何呢?由於雖然插入和刪除元素的操做是O(1)的沒錯,可是要想插入或刪除節點,你必須得知道節點在哪,獲取節點的操做是O(N)的,
所以總的時間複雜度爲O(N)。儘管如此,鏈表插入刪除元素的速度依舊是要優於數組的。內存
鏈表適合存儲對元素查找,訪問要求低;可是對刪除,插入要求高的數據。get