文章目录
- 题目介绍
- 题解
题目介绍

题解

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        // 创建一个哑节点,它的 next 指向头节点,方便处理
        ListNode dummy = new ListNode(0, head);
        // p0 用于指向反转部分的前一个节点
        ListNode p0 = dummy;
        // 移动 p0 到反转部分的前一个节点
        for (int i = 0; i < left - 1; i++) {
            p0 = p0.next;
        }
        ListNode cur = p0.next, pre = null;
        // 执行反转
        for (int i = 0; i < right - left + 1; i++) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        // 反转完之后,cur 指向需要反转部分的下一个节点
        // pre指向需要反转部分的最后一个节点
        // 此时 p0.next 还和原来一样,指向未反转时需要反转的第一个节点
        p0.next.next = cur;
        p0.next = pre;
        // 返回哑节点的下一个节点,即头节点
        return dummy.next;
    }
}



















