LeetCode 92.反转链表II
发布日期:2025-04-05 00:31:47 浏览次数:12 分类:精选文章

本文共 1851 字,大约阅读时间需要 6 分钟。

反转链表的某一部分看起来可能有点复杂,但只要掌握了正确的方法,并一步一步来,应该是可以顺利完成的。以下是解决这个问题的详细思路:

问题分析

给定一个链表,要求反转从位置m到n的部分。例如,一个链表为1→2→3→4→5→NULL,如果m=2,n=4,那么反转后的链表应该是1→4→3→2→5→NULL。

为了完成这个任务,我们可以采用一个常用的方法:使用三指针来记录相对于反转区间的前后节点,然后逐步反转这段区间的链表,并与后续的节点相连。

解决方法

以下是详细的步骤解释:

  • 初始化辅助节点

    • 创建一个新的节点l,并将其下一个指针连接到原链表的头节点。这样可以简化处理某些边界情况。
    • 初始化指针p,用于从l出发,遍历到m-1的位置。也就是,p会停在第m-1个节点之后。
  • 指针设置

    • 设定ap节点的后一个节点,也就是从m开始的起点。
    • 设定ba节点的后一个节点。
  • 反转过程

    • 从m到n的位置,逐步反转该段链表。具体来说,在每一步中:
      • a的下一个指针设置为当前的b
      • b的下一个指针设置为原来的a
    • 同时,更新ab的指针,分别指向反转链表中的下一个位置。
  • 连接已反转链表和剩余部分

    • 当到达n节点时,停止反转。此时:
      • a指向原n节点的下一个节点(即n+1的位置)。
      • b指向原n节点的下一个下一个节点。
    • p的下一个指针连接到b
    • a节点的下一个指针连接到已反转链表的开头(即a此时指向反转后的起始节点)。
  • 返回结果

    • 最终,反转后的链表从l的下一个节点开始,因此返回这个节点作为结果。
  • 实现代码

    下面是进行上述思路的代码实现:

    class Solution {    public ListNode reverseBetween(ListNode head, int m, int n) {        if (head == null) {            return null;        }                // 创建辅助节点l,并将其下一个指针设置为head        ListNode l = new ListNode(-1);        l.next = head;                // 指针p用于遍历到m-1的位置        ListNode p = l;        for (int i = 0; i < m - 1; i++) {            p = p.next;        }                // 从m的位置开始反转        ListNode a = p.next; // 代表反转区间的第一个节点        ListNode b = a.next; // 代表反转区间的第二个节点                // Traverse from m to n, and reverse the part        for (int i = m; i <= n; i++) {            // 将b的下一个指向a,a的下一个接下来指向最近的b            b.next = a;            a = b; // 前进一个节点            b = b.next; // 前进当前节点的下一个节点        }                // 当到达n时,a指向n+1位置的节点,b则指向n+2位置        // 将p的下一个指向反转后的起点a        p.next.next = a;        // 将a的下一个节点连接到l的下一个节点        a.next = l.next;                // 返回l的下一个节点,即反转后的链表开头        return l.next;    }}

    代码解释

    • 辅助节点l:用于简化处理某些特定情况,例如链表的前后节点连接操作。
    • 指针p:从l开始遍历,直到到达反转区间的起点m-1的位置。
    • 指针ab:分别指向反转区间的头和尾,逐步反转这段链表。
    • 循环反转:从m到n逐个节点反转,确保每个节点的连接正确。
    • 最终连接:将反转部分与剩余链表相连,并返回结果。

    通过这种方法,我们可以在O(n)的时间复杂度内完成反转操作,无法直接通过索引修改链表结构,因此这种方法是可行的。

    最终得到的链表满足条件,反转后的部分正确,且整个链表的结构没有被破坏。

    上一篇:LeetCode 96. Unique Binary Search Trees
    下一篇:LeetCode 88. 合并两个有序数组,java合并两个有序数组 含自己思考代码

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月26日 13时50分30秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章