难度中等425收藏分享切换为英文关注反馈
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
public static ListNode reverseBetween(ListNode head, int m, int n) {
//先扫描到m和n的位置,找到m的前一个节点和n的后一个节点
//然后反转m到n的位置
//然后接回去
ListNode mPre = null;
ListNode mNode = head;
ListNode nNode;
ListNode nNext;
//找到m以及m的前一个节点
for (int i = 0; i < m - 1; i++) {
mPre = mNode;
mNode = mNode.next;
}
//找到n以及n的下一个节点
nNode = mNode;
nNext = mNode.next;
for (int i = 0; i < n - m; i++) {
nNode = nNode.next;
nNext = nNext.next;
}
//找到m和n后断开
if (mPre != null) {
mPre.next = null;
}
nNode.next = null;
ListNode pre = null;
ListNode next;
ListNode newHead = mNode;
while (newHead != null) {
next = newHead.next;
newHead.next = pre;
pre = newHead;
newHead = next;
}
mNode.next = nNext;
if (mPre != null) {
mPre.next = pre;
return head;
} else {
return pre;
}
}