/**
*
* 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.
*
*/
public class ReverseLinkedListII {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
// 44 / 44 test cases passed.
// Status: Accepted
// Runtime: 197 ms
// Submitted: 0 minutes ago
//题意:将位于[m, n]位置上的节点反转
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m == n) return head;
ListNode preHead = new ListNode(-1);
preHead.next = head;
ListNode preMNode, mNode, nNode, afterNode;
ListNode cursor = preHead;
//提取出位置[m, n] 上的所有节点
int count = 0;
while((++count) != m) cursor = cursor.next;
preMNode = cursor;
mNode = cursor.next;
while((count++) != n) cursor = cursor.next;
nNode = cursor.next;
//保存n节点之后的节点
afterNode = nNode.next;
//将位置 [m, n]上的节点翻转
nNode.next = null; //标记游标是否到达尾部
cursor = mNode;
while(cursor != null) {
ListNode node = cursor;
cursor = cursor.next;
node.next = preMNode.next;
preMNode.next = node;
}
mNode.next = afterNode;
return preHead.next;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}