LeetCode92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
迭代,反转法
因为要反转中间的链表,所以我把链表分成三部分(前部分链表,反转链表和后部分链表)
找到前部分链表的尾节点(第m-1个节点)就可以开始反转,最后把三个链表拼接
前部分链表(1~m-1)
反转链表(m~n)
后部分链表(n~最后)
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode cur = head;
ListNode prev = null;
//找出第二部分(需要饭转的部分)开头
while (m>1){
prev = cur;
cur = cur.next;
m--;
n--;
}
ListNode tail = cur;
ListNode before = cur;
//after用来保存下一个节点,当第二部分反转完成后,after是第三部分的开始节点
ListNode after = cur.next;
//反转 m~n 部分的节点
while (n>1){
cur = after;
after = cur.next;
cur.next = before;
before = cur;
n--;
}
//反转结束,将3部分连接起来
if(prev == null){
tail.next = after;
head = before;
}else {
prev.next = before;
tail.next = after;
}
return head;
}