# Reverse Linked List II

This is No.92 in leetcode.

The problem description:

Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ m ≤ n ≤ length of list.

I have a wrong idea on this problem, so I post the reference solution below:

``````class Solution {

// Object level variables since we need the changes
// to persist across recursive calls and Java is pass by value.
private boolean stop;
private ListNode left;

public void recurseAndReverse(ListNode right, int m, int n) {

// base case. Don't proceed any further
if (n == 1) {
return;
}

// Keep moving the right pointer one step forward until (n == 1)
right = right.next;

// Keep moving left pointer to the right until we reach the proper node
// from where the reversal is to start.
if (m > 1) {
this.left = this.left.next;
}

// Recurse with m and n reduced.
this.recurseAndReverse(right, m - 1, n - 1);

// In case both the pointers cross each other or become equal, we
// stop i.e. don't swap data any further. We are done reversing at this
// point.
if (this.left == right || right.next == this.left) {
this.stop = true;
}

// Until the boolean stop is false, swap data between the two pointers
if (!this.stop) {
int t = this.left.val;
this.left.val = right.val;
right.val = t;

// Move left one step to the right.
// The right pointer moves one step back via backtracking.
this.left = this.left.next;
}
}

public ListNode reverseBetween(ListNode head, int m, int n) {