連結串列(Linked List)是一種線性資料結構,它由一系列節點(Node)組成,每個節點包含兩部分:資料和指向下(上)一個節點的參照(或指標)。連結串列中的節點按照線性順序連線在一起(相鄰節點不需要儲存在連續記憶體位置),不像陣列一樣儲存在連續的記憶體位置。連結串列通常由頭節點(Head)來表示整個連結串列,而尾節點的下一個節點指向null,表示連結串列的結束。
連結串列有幾種常見的型別,其中最常見的包括單連結串列、雙連結串列。
// Java LinkedList 中Node的結構
class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
連結串列基本結構是節點,節點一般包含資料和指向節點的指標;節點只有指向下一個節點指標的叫單連結串列(Singly Linked List),有指向上一個節點的指標的叫雙連結串列(Doubly Linked List)。
連結串列的一些關鍵特點:
連結串列的性質:
連結串列最基本的一些演演算法應用 是 根據要求操作節點指標 next 指標。
給你一個 非嚴格遞增排列 的陣列 nums ,請你 原地 刪除重複出現的元素,使每個元素 只出現一次 ,返回刪除後陣列的新長度。元素的 相對順序 應該保持 一致 。然後返回 nums 中唯一元素的個數。
給你一個連結串列的頭節點 head 和一個整數 val ,請你刪除連結串列中所有滿足 Node.val == val 的節點,並返回 新的頭節點 。
在解決一些演演算法問題,同樣可以定義多個指標指向多個連結串列節點(Node)來進行操作來完成解答。
給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。
給你兩個 非空 的連結串列,表示兩個非負的整數。它們每位數位都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數位。
請你將兩個數相加,並以相同形式返回一個表示和的連結串列。
你可以假設除了數位 0 之外,這兩個數都不會以 0 開頭。
本篇主要介紹了連結串列基本結構,以及相關一些演演算法問題分析。連結串列還可以結合其他資料結構、演演算法思想比如 雜湊(Hash)、優先佇列(Priority Queue)等解決一些演演算法問題;考慮到本系列文章希望能夠承前啟後,不至於出現一些先前文章未介紹到的資料結構與演演算法,因此後續文章中再代入分析。
另外,從出題人的角度分析演演算法的問題也是一個不錯的選擇,可能會帶來不一樣的總結與經驗。
歡迎點個小紅心,關注公眾號 Java研究者 聯絡、交流~