- 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
// class Solution {
// public ListNode reverseBetween(ListNode head, int left, int right) {
// return reverse(head, left, right);
// // return reverse(head, 5);
// }
// public ListNode reverse(ListNode head, int m, int n) {
// if(m == 1) { // 反转head第m个位置开始的节点起数第n-m个节点内范围的链表
// return reverse(head, n);
// }
// // 一定要有head.next = reverse(),因为下面return要返回当前操作完成的一个完整链
// head.next = reverse(head.next, m - 1, n - 1);
// return head;
// }
// // 反转链表第1到n个节点范围的链表
// ListNode lastNode = null;
// public ListNode reverse(ListNode head, int n) {
// if(n == 1) {
// lastNode = head.next;
// return head;
// }
// ListNode last = reverse(head.next, n - 1);
// head.next.next = head;
// head.next = lastNode;
// return last;
// }
// }
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode a = dummyNode;
int i = 0;
while (i < left - 1) {
a = a.next;
i++;
}
i = 0;
// 方式一
// ListNode pre = a.next, b = a.next, cur = pre == null ? null : pre.next, next;
// while (cur != null && i < right - left) {
// next = cur.next;
// cur.next = pre;
// // pre.next = next;
// a.next = cur;
// pre = cur;
// cur = next;
// i++;
// }
// b.next = cur;
// 方式二
ListNode last = a.next, top;
for (; i < right - left; ++i) {
top = last.next;
// 连尾
last.next = top.next;
// 反转
top.next = a.next;
// 连头结点
a.next = top;
}
return dummyNode.next;
}
}