解法都在代码里,不懂就留言或者私信
/**
* 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) {
/**如果就一个节点,还反转个啥,如果反转区间就一个节点,怎么反转也都是自己*/
if(head.next == null || left == right) {
return head;
}
/**我们要做的是:1断开前后的连接(记录left之前一个节点pre和right之后的节点next) 2. 反转需要的部分 3. pre连接新的头
新的尾连接next(新的尾就是原来的头)*/
int count = 1;
ListNode pre = null;
ListNode cur = head;
while(count < left) {
pre = cur;
count ++;
cur = cur.next;
}
ListNode curRangeFirst = cur;
/**如果前面有节点,断开和前面节点的关联 */
if(pre != null) {
pre.next = null;
}
/**两个while的条件都是小于,因为小于再next一下才是真正的第left(right) 个节点 */
while(count < right) {
count ++;
cur = cur.next;
}
ListNode curRangeLast = cur;
/**断开和后面链表节点的关联 */
ListNode next = cur.next;
cur.next = null;
reverse(curRangeFirst);
if(pre != null) {
pre.next = curRangeLast;
}
curRangeFirst.next = next;
/**如果是1,涉及换头,换的头就是当前left~right区间的最后一个节点(curRangeLast) */
return left == 1? curRangeLast : head;
}
public void reverse(ListNode head) {
ListNode pre = null;
ListNode next = null;
ListNode cur = head;
while(cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
}
}