92. Reverse Linked List II
題目
將一個鏈表從m到n進行反轉,要求:Do it in-place and in one-pass. 即在原地進行反轉,不要開闢額外的空間,且只能遍歷一遍。
比如:
給出 1->2->3->4->5->NULL, m = 2 , n = 4,
返回 1->4->3->2->5->NULL.
注意:m,n需要滿足以下條件: 1 ≤ m ≤ n ≤ length of list.
代碼塊
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null)return null;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode start = head;
ListNode then = head.next;
for(int i = 0; i < m-1; i++){ //這是從0到m-1 按照順序來顯示:找m
pre = pre.next;
start = start.next;
then = then.next;
}
// for(int i = m-1 ; i < n - m; i++){ 爲什麼要從0開始呢? 難道不是從m就得來置換了嗎?
for(int i = 0 ; i < n - m; i++){ //如果從m-1 開始,結果爲132456.就換了一次。why????:交換。
start.next = then.next;
then.next = pre.next;
pre.next = then;
then = start.next;
}
return dummy.next;
}
}
代碼分析
遇到的問題:
1. 是for 循環,不是if循環
2. 它們的作用,第一個for循環是找到m;第二個for循環是將m後的元素(m~n)逐一進行交換。注意兩個i是不一樣的,都是表示循環變量,但是有不一樣的含義。
3. 注意使用dummy是爲了知道head的前置結點。最後返回dummy.next就可以保持住頭結點了。