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.
Analysis:
1. Iterating the original singly-linked list until len>=n.
2. Start to adjust the list until len>=m.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m==n || head==null || head.next==null) return head;
int len=1;
ListNode newhead = new ListNode(0);
newhead.next = head;
ListNode pre = newhead;
ListNode cur = head;
ListNode nex = head.next;
while(len<n) {
if(len>=m) {
cur.next = nex.next;
nex.next = pre.next;
pre.next = nex;
nex = cur.next;
}
else {
pre = cur;
cur = nex;
nex = nex.next;
}
len++;
}
return newhead.next;
}
}