Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
1 public class Solution { 2 public ListNode reverseBetween(ListNode head, int m, int n) { 3 if (m >= n || head == null) { 4 return head; 5 } 6 7 ListNode dummy = new ListNode(0); 8 dummy.next = head; 9 head = dummy; 10 11 for (int i = 1; i < m; i++) { 12 if (head == null) { 13 return null; 14 } 15 head = head.next; 16 } 17 18 ListNode premNode = head; 19 ListNode mNode = head.next; 20 ListNode nNode = mNode, postnNode = mNode.next; 21 for (int i = m; i < n; i++) { 22 if (postnNode == null) { 23 return null; 24 } 25 ListNode temp = postnNode.next; 26 postnNode.next = nNode; 27 nNode = postnNode; 28 postnNode = temp; 29 } 30 mNode.next = postnNode; 31 premNode.next = nNode; 32 33 return dummy.next; 34 } 35 }