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