反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//------------------------------------------------------------------------------
//example:
// x -> x -> x -> x 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 x -> x -> x ->
// ^prevHead ^prev ^curr
// ^reverseHead ^reverseTail
//------------------------------------------------------------------------------
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m==n)
return head;
ListNode sentinel = new ListNode(0);
sentinel.next = head;
ListNode reverseHead = head;
ListNode reverseTail = head;
ListNode prevHead = sentinel;
for(int i=0;i<m-1;i++)
{
reverseHead = reverseHead.next;
prevHead = prevHead.next;
}
ListNode prev = reverseHead;
ListNode curr = prev.next;
for(int i=0;i<n-m;i++)
{
reverseTail = curr;
curr = curr.next;
reverseTail.next = prev;
prev = reverseTail;
}
prevHead.next = reverseTail;
reverseHead.next = curr;
return sentinel.next;
}
}