/**
* 首先生成一个首节点
* t1指针保存m前一个节点
* t2指针保存n的后一个节点
* tail指针保存反转后的尾节点
* pre指针保存反转后的首节点
* t1.next = pre;
* tail.next = t2;
*
* @param head
* @param m
* @param n
* @return
*/
public static ListNode reverseBetween(ListNode head, int m, int n) {
// write code here
if (m == n) {
return head;
}
int i = 0;
int j = 0;
ListNode node = new ListNode(0);
node.next = head;
ListNode cur = node;
ListNode next;
ListNode pre = null;
ListNode t1 = node;
ListNode t2 = null;
ListNode tail = null;
while (cur != null) {
next = cur.next;
if (i >= m && j <= n) {
cur.next = pre;
pre = cur;
cur = next;
} else if (i + 1 == m) {
t1 = cur;
} else if (j > n) {
t2 = cur;
break;
}
if (i < m) {
i++;
cur = next;
tail = cur;
}
j++;
}
t1.next = pre;
tail.next = t2;
return node.next;
}