反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路:
反转m到n之间 注意 第m个节点会是反转部分的最后一个 即是尾巴 所以要记录下来 而第m-1个节点将会是这一部分的前一个节点 即为头 也要记录下来 然后对内部反转 最后将头和尾做处理
public ListNode reverseBetween(ListNode head, int m, int n) {
// 判断是否为空
if (head == null) {
return null;
}
//移动两个指针直到它们达到开始边界
ListNode cur = head, prev = null;
while (m > 1) {
prev = cur;
cur = cur.next;
m--;
n--;
} //退出循环时 cur恰好达到第m个点
// 记录头和尾
ListNode con = prev;
ListNode tail = cur;
// Iteratively reverse the nodes until n becomes 0.
ListNode inNext = null;
while (n > 0) {
inNext = cur.next;
cur.next = prev;
prev = cur;
cur = inNext;
n--;
}
//退出循环时 pre来到第n个点 cur来到第n+1个点
if (con != null) {
con.next = prev; //连接头
} else {
head = prev;
}
// cur已经来到第n+1个点
tail.next = cur; //连接尾
return head;
}