底層結構
- 數組是需要連續的一整塊內存來進行存儲的,因此如果說開闢一個非常大的內存的話,如果JVM連續性內存不夠那麼就會開闢失敗。而鏈表相反,它通過指針將零散的內存空間串起來使用,使用內存效率比較高。
數據插入
- 和數組相反。因爲鏈表是不連續的內存空間,插入和刪除會非常的快
數據查詢
- 鏈表要想隨機訪問第 k 個元素,就沒有數組那麼高效了。因爲鏈表中的數據並非連續存儲的,所以無法像數組那樣,根據首地址和下標,通過尋址公式就能直接計算出對應的內存地址,而是需要根據指針一個結點一個結點地依次遍歷,直到找到相應的結點。
- 時間複雜度爲O(n)
應用場景舉例以及代碼實現
求鏈表的中間結點
思路:
定義兩個指針fast和slow。slow一次遍歷一個節點,fast一次遍歷兩個節點,由於fast的速度是slow的兩倍,所以當fast遍歷完鏈表時,slow所處的節點就是鏈表的中間節點。
public static Node middleNode(Node head) {
if (head == null || head.next == null) {
return head;
}
Node slow = head;
Node fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return fast == null ? slow : slow.next;
}
思路很重要