🎯 请点击上方原题链接,查看题目描述👆
💭 解题思路#
这道题要求反转链表中指定区间的节点,核心思路是使用头插法来实现局部反转。
算法步骤:#
- 创建虚拟头节点 - 统一处理边界情况
- 定位到反转区间的前一个节点 - 通过循环找到
pre
节点 - 使用头插法反转指定区间 - 将区间内的节点逐个移动到区间开头
关键思想:#
- 不需要完全反转整个区间,而是通过头插法将后面的节点依次插入到区间开头
- 每次操作都将
cur.next
节点移动到pre.next
位置
💻 代码实现#
class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { // 创建虚拟头节点,简化边界处理 ListNode res = new ListNode(-1); res.next = head; ListNode pre = res;
// 定位到反转区间的前一个节点 for(int i = 0; i < left - 1; i++){ pre = pre.next; }
// cur指向反转区间的第一个节点 ListNode cur = pre.next;
// 使用头插法反转 (right - left) 次 for(int i = 0; i < (right - left); i++){ ListNode temp = cur.next; // 保存要移动的节点 cur.next = temp.next; // cur跳过next节点 temp.next = pre.next; // next插入到pre后面 pre.next = temp; // 更新pre的next指针 }
return res.next; }}
🔍 关键要点#
核心操作(头插法):
temp = cur.next
- 保存要移动的节点cur.next = temp.next
- cur 跳过 next 节点temp.next = pre.next
- next 指向当前区间第一个节点(pre.next)pre.next = temp
- pre 指向 next,使其成为新的第一个节点(头插法)
🤔 反思总结#
这道题的精髓在于头插法的应用,通过巧妙的指针操作实现局部反转,避免了复杂的链表拆分和重组。关键是理解每次操作都是将当前节点的下一个节点”提升”到区间开头的思想。
时间复杂度: O(n) - 最多遍历整个链表一次
空间复杂度: O(1) - 只使用常数个额外变量