206. Reverse Linked List --- Easy
92. Reverse Linked List II --- Medium
24. Swap Nodes in Pairs --- Medium
ListNode定義
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
1. 單鏈表的逆序 Reverse Linked List - Leetcode 206
思路:
可以用三個指針pre,current,post遍歷這個鏈表耙替。
pre指向逆序鏈表的頭結(jié)點;
current指向當(dāng)前需要被逆序的結(jié)點立宜;
post指向當(dāng)前的下一個結(jié)點。
注意:
處理好鏈表為空,長度為1的特殊情況。
處理第一個結(jié)點疮茄,將head的next設(shè)置為空。
處理好終止條件根暑。
2. 單鏈表部分逆序 Reverse Linked List II - Leetcode 92
題目:
這道題看著簡單,因為思路很明顯徙邻,找到其中的子鏈表排嫌,進(jìn)行逆序,再將逆序的子鏈表接入原鏈表即可缰犁。
但是寫起來復(fù)雜淳地,因為邊界條件太多了,需要一一考慮到帅容。
思路:
遍歷單鏈表颇象,找到指定的子鏈表時,對結(jié)點進(jìn)行逆序并徘。
在思路上遣钳,可以將鏈表分成三段,first linked list麦乞,second linked list(即需要逆序的子鏈表)蕴茴,third linked list。那么有幾個關(guān)鍵node需要記錄下來姐直,firstTail倦淀,secondTail,secondHead声畏,thirdHead撞叽。
等到遍歷結(jié)束,將這三段鏈表重新接起來插龄。
遍歷過程中的關(guān)鍵節(jié)點:
- 開始遍歷第一個結(jié)點時
- 結(jié)束first linked list愿棋,進(jìn)入子鏈表時
- 結(jié)束子鏈表處理,進(jìn)入third linked list時
- 尾結(jié)點
edge case:
有很多邊界情況需要考慮到
- 鏈表為空辫狼,或長度為1
- left == right
- left == 1初斑,那么first linked list為空
- right == length,third linked list為空
3. 交換相鄰結(jié)點 Swap Nodes in Pairs --- Leetcode 24
題目:
思路:
解法很直觀膨处,指針遍歷见秤,每相鄰兩個結(jié)點互換砂竖。
注意:
注意的點在于,相鄰的兩個結(jié)點互換后鹃答,要注意將其與前面處理過的鏈表連接起來乎澄。