92.Reverse Linked List II

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就可以保持住頭結點了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章