如圖所示,你會發現,其中有兩個結點比較特殊,他們分別是第一個結點和最後一個結點。咱們習慣把第一個結點叫作頭結點,把最後一個結點叫作尾結點。其中,頭結點用來記錄鏈表的基地址。有了它,咱們能夠遍歷獲得整條鏈表。而尾結點特殊的地方是:指針不是指向下一個結點,而是指向一個空地址NULL,表示這是鏈表上最後一個結點。與數組同樣,鏈表也支持數據的查找、插入和刪除操做。咱們知道,進行數組的插入,刪除操做時,爲了保持內存的連續性,須要作出大量的數據搬移,因此時間複雜度是O(n)。而在鏈表中插入或者刪除一個數據,咱們並不須要爲了保持內存的連續性而搬移結點,圖中能夠看出,針對鏈表的插入和刪除操做,咱們只須要考慮相鄰結點的指針改變,因此對應時間複雜度是O(1)。數組
可是有利也有弊。鏈表想要隨機訪問第K個元素,就沒有數組高效了。由於鏈表中的數據並不是連續存儲的,因此沒法像數組那樣,根據首地址和下標,經過尋址公式就能計算出內存地址,而是須要根據指針一個結點一個結點地依次遍歷,直到找到對應的結點。因此,鏈表隨機訪問的性能沒有數組好,須要O(n)的時間複雜度。性能
從圖中能夠看出,雙向鏈表須要額外的兩個空間來存儲後繼結點和前驅結點的地址。因此存儲一樣多的數據,雙向鏈表要比單鏈表佔用更多的內存空間。雖然兩個指針比較浪費存儲空間,但能夠支持雙向遍歷。spa