????很多鏈表題目都可以歸結為鏈表的遍歷,以及在遍歷中做反轉、插入和刪除操作,因此可以使用鏈表遍歷的框架來解題。鏈表遍歷的框架代碼如下:
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
? ? // 進行操作,prev 表示前一個結點,curr 表示當前結點
? ? if (prev == null) {
? ? ? ? // curr 是頭結點時的操作
? ? } else {
? ? ? ? // curr 不是頭結點時的操作
? ? }
? ? prev = curr;
? ? curr = curr.next;
}
????在遍歷的過程中,需要一直維護 prev 是 curr 的前一個結點。curr 是循環中的主指針,整個循環的起始和終止條件都是圍繞 curr 進行的。prev 指針作為輔助指針,實際上就是記錄 curr 的上一個值。在每一輪遍歷中,可以根據需要決定是否使用 prev 指針。注意 prev 可能為 null(此時 curr是頭結點),在使用前需要先進行判斷。
總結:解決單鏈表問題時,遵循的步驟是:
????????1). 判斷問題是否為鏈表遍歷-修改,套用鏈表遍歷框架
????????2). 思考單步操作,將代碼加入遍歷框架
????????3). 檢查指針丟失等細節
有很多更復雜的鏈表題目都以反轉鏈表為基礎。下面列出了 LeetCode 上幾道相關的題目:
* LeetCode 203 - Remove Linked List Elements[2] 是一道直白的鏈表刪除題目
* LeetCode 445 - Add Two Numbers II[3] 以反轉鏈表為基礎解題
* LeetCode 92 - Reverse Linked List II[4] 反轉部分鏈表