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.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null)
return null;
if(m == n || n <= 1)
return head;
int cnt = 1;
ListNode headLast = new ListNode(-1);
headLast.next = head;
ListNode last1 = headLast;
ListNode p1 = last1.next;
ListNode last2 = headLast;
ListNode p2 = head.next;
while(cnt <= n){
if(cnt < m){
last1 = p1;
p1 = p1.next;
}
if(cnt < n){
last2 = p2;
p2 = p2.next;
}else{
ListNode tail = p2;
last2.next = null;
ListNode newHead = reverseList(p1);
p1 = newHead;
while(p1.next != null){
p1 = p1.next;
}
p1.next = tail;
last1.next = newHead;
break;
}
cnt++;
}
return headLast.next;
}
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode p = head;
ListNode q = head.next;
p.next = null;
head = p;
while (q != null) {
ListNode temp = q.next;
q.next = null;
p = q;
p.next = head;
head = p;
q = temp;
}
return p;
}
}