我們知道陣列需要一塊連續的記憶體空間來儲存資料,而鍊錶恰恰相反,它並不需要連續的記憶體空間,它通過"指標"將零散的記憶體塊連線起來使用,通常將記憶體塊稱為鍊錶的「結點」.
單鏈表
既然是儲存資料,那就少不了插入和刪除操作,與陣列不同,鍊錶的插入和刪除不需要搬移資料,
插入
刪除
從圖中可以看出鍊錶的插入和刪除操作,只需要改變相鄰結點的指標就可以了,相比陣列而言,鍊錶不需要搬移資料,因為鍊錶中並非連續儲存資料,所以鍊錶無法像陣列一樣,支援隨機訪問.如果鍊錶要查詢某個資料需要從頭結點開始遍歷查詢,直到找到要查詢的資料.
迴圈鍊錶
迴圈鍊錶是一種特殊的單鏈表,尾結點的指標指向首結點的位址
雙向鍊錶
從圖中可以看出雙向鍊錶需要額外的空間來儲存前結點的位址,與單鏈表相比,儲存同樣的資料雙向鍊錶要占用更多的空間,但卻的特點的條件下,使用雙向鍊錶要比使用單向鍊錶的效率要高些,畢竟吃的多不出力可不行(空間換時間),例如要在指定結點前插入乙個資料時,雙向鍊錶已經記錄了前乙個結點的位址,可以直接操作,而單向鍊錶需要重新查詢.
單鏈表反轉
public static node reverse(node list) return pre; }
鍊錶中環的檢測
public static boolean checkcircle(node list) return false; }
兩個有序鍊錶的合併
public listnode mergetwolists(listnode l1, listnode l2) else p = p.next; } if (l1 != null) if (l2 != null) return soldier.next; }
刪除鍊錶倒數第n個結點
public static node deletelastkth(node list, int k) if (fast == null) return list; node slow = list; node prev = null; while (fast.next != null) if (prev == null) else return list; }
求鍊錶的中間結點
public static node findmiddlenode(node list) return slow; } public static void printall(node list) system.out.println(); } public static node createnode(int value) public static class node public int getdata() }
通過前面的內容,我們知道了,陣列和鍊錶是兩種截然不同的記憶體組織方式,正是因為記憶體儲存的區別,導致了他們的特性截然相反.
陣列 優點
缺點隨機訪問性強
插入和刪除效率低
查詢效率高
可能浪費記憶體
陣列大小固定,不能動態擴充套件
鍊錶優點
缺點插入刪除速度快
不能隨機查詢
內容利用率高
必須從第乙個開始遍歷,查詢效率低
大小沒有固定,擴充套件和靈活
輸入一組數,構建有序鍊錶 (C語言實現)
要求說明 輸入一組數,構建有序鍊錶。整體思路 用陣列儲存這組數,每次都去找最小值,把最小值構建結點並使用頭插法插入到單鏈表中。然後將該值刪掉 為簡便起見,把值弄成max 這裡使用的是類直接插入的排序方法。實現 include include define max 1000000 單鏈表結構體定義 t...
C語言 K個一組翻轉鍊錶
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...
Leetcode K個一組反轉鍊錶C 實現
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序採用了棧來完成,遍歷整個鍊錶,並將結點逐個存入棧中,當棧中存放結點數量 k時,將棧中元素依次彈出,建立乙個新的鍊錶。值得注意...