
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个节点之后。
指针设置:
- 设定
a
为p
节点的后一个节点,也就是从m开始的起点。 - 设定
b
为a
节点的后一个节点。
反转过程:
- 从m到n的位置,逐步反转该段链表。具体来说,在每一步中:
- 将
a
的下一个指针设置为当前的b
。 - 将
b
的下一个指针设置为原来的a
。
- 将
- 同时,更新
a
和b
的指针,分别指向反转链表中的下一个位置。
连接已反转链表和剩余部分:
- 当到达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的位置。 - 指针
a
和b
:分别指向反转区间的头和尾,逐步反转这段链表。 - 循环反转:从m到n逐个节点反转,确保每个节点的连接正确。
- 最终连接:将反转部分与剩余链表相连,并返回结果。
通过这种方法,我们可以在O(n)的时间复杂度内完成反转操作,无法直接通过索引修改链表结构,因此这种方法是可行的。
最终得到的链表满足条件,反转后的部分正确,且整个链表的结构没有被破坏。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月26日 13时50分30秒
关于作者

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