1public ListNode reverseBetween(ListNode head, int m, int n) {
2 if (head == null || m == n) return head;
3
4 ListNode dummy = new ListNode(0);
5 dummy.next = head;
6 ListNode pre = dummy;
7
8 // Move pre to just before reversal start
9 for (int i = 1; i < m; i++) {
10 pre = pre.next;
11 }
12
13 ListNode start = pre.next; // First node to reverse
14 ListNode then = start.next; // Node to be reversed
15
16 // Reverse the sublist
17 for (int i = 0; i < n - m; i++) {
18 start.next = then.next;
19 then.next = pre.next;
20 pre.next = then;
21 then = start.next;
22 }
23
24 return dummy.next;
25}