陣列的特點
在記憶體中連續
利用下標定位元素,因此查詢操作的時間複雜度為o(1)
增加與刪除元素時,需要進行移動,因此增加與刪除操作的時間複雜度為o(n)
陣列大小固定,不能直接擴容。如果需要擴容,也是建立乙個更大的陣列,再將元素複製過去。
鍊錶的特點
在記憶體中可以不連續
增加與刪除元素的操作很方便,只需要移動指標,不需要移動元素,因此增加與刪除的操作的時間複雜度為o(1)
不能隨機查詢元素,查詢任何乙個元素,需要從頭結點開始遍歷,直到查詢到指定的元素,時間複雜度為o(n)
當然,鍊錶中的單鏈表只能從一頭開始查詢,而雙鏈表則可以從兩頭分別往中間進行查詢。
單鏈表結構圖
單鏈表的每個節點,只能有乙個data和乙個指向下乙個節點的指標next,因此只能從頭結點開始,順著next指標遍歷。
單鏈表刪除乙個節點,需要在遍歷的同時,一路儲存著待刪除節點的前驅節點,等到查到待刪除節點時,直接將前驅節點指向待刪除節點的後繼節點,最後斷開待刪除節點的指標即可。
雙鏈表結構圖
在查詢乙個元素時,單鏈表的表現往往沒有雙鏈表好,單鏈表只能攢足了勁一頭往前衝,而雙鏈表則可以派兩個人一頭一尾地毯式搜尋。儘管雙鏈表的查詢效率較高,但是單鏈表的使用率還是高於雙鏈表。
雙鏈錶比單鏈表,也就多乙個指標,差別就在這個指標上,這個需要從空間角度來考慮。
在32位系統中,乙個指標占用4個位元組;在64位系統中,乙個指標占用8個位元組。(指標的大小和指向的內容以及內容的大小無關)
那麼乙個具有n個節點的雙鏈表,就比同樣大小的單鏈表多了高達8*n個位元組,而記憶體往往是珍貴的。
單鏈表和雙鏈表的查詢效率在現在的機器上,其實區別不大。相比之下,單鏈表的使用率高於雙鏈表。
判斷鍊錶是否有環的問題,算是面試中的高頻考點了,有額外空間、快慢指標等方法,當然面試官也會繼續深入。
有興趣的胖友,可以參考我的另外一篇文章,【leetcode】環形鍊錶及拓展
資料結構 單鏈表雙鏈表9 18
單鏈表結點類node宣告如下,成員變數data表示結點的資料域,儲存資料元素,資料型別為t,next表示結點的指標域,儲存後繼結點的位址。檔名為node.h template class node public t data node next node this next null node t ...
回顧單鏈表,堆疊,佇列,雙鏈表資料結構
這幾個資料結構還是比較通俗易懂的,其中堆疊和佇列可以用陣列封裝實現,也可以用雙端鍊錶實現,等等不多複述。個人感覺資料結構真正複雜的是樹型結構,多叉樹,二叉樹,平衡二叉樹,b 樹,b 樹,紅黑樹,他們關係和區別,目前也說不清楚。這一塊是我感覺很薄弱的地方。簡單寫了個單鏈表,其他的懶得寫了,下篇開始搞搞...
單鏈表和雙鏈表
單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...