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就可以保持住头结点了。

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