「每日LeetCode」2020年11月21日
本文最后更新于:2023年3月19日 晚上
Lt92. 反转链表 II
92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
1 |
|
思路
结合206. 反转链表的思路。将链表分割成三部分,头部尾部以及需要翻转的部分。
- 使用 dummy 哑结点解决 m=1 的情况。首先进行一部分遍历,temp 为遍历的指针,直到当前 temp 节点的 next 为需要翻转节点的首节点。
- 再使用一个 cur 作为临时指针。此时问题就转化成了206. 反转链表,但是不需要完全翻转,只需要翻转 n-m+1 个元素即可,所以使用 for 再进行一次遍历,遍历次数为 n-m+1 次。例如
1->2->3->4->5->6->NULL, m = 2, n = 4
这个用例,temp 为1->2->3->4->5->6->NULL
,cur 为2->3->4->5->6->NULL
,对 4-2+1 三个元素:2、3、4 进行反转。建立一个 prev 作为记录上一个节点的指针,初始指向 null,执行以下过程。- 先使用
nextTemp
记录cur.next
cur.next
指向prev
prev
指向cur
cur
指向nextTemp
- 先使用
- 执行完以上过程之后,会将链表划分为三段。
prev
指向已经翻转完毕的链表的开始4->3->2->NULL
,cur 指向剩余的尾部链表5->6->NULL
。因为修改过 2 的指向,所以temp
会变成1->2->NULL
。 - 现在要修改指向,2 的 next 应该指向尾部,1 的 next 应该指向翻转完毕链表。所以
temp.next.next
指向cur
,temp.next
指向prev
,即可将三段重新拼接成一条链表。
解答
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!