92. 反转链表 II

摘要
Title: 92. 反转链表 II
Categories: 链表

Powered by:NEFU AB-IN

Link

92. 反转链表 II

题意

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

思路

203 反转链表的升级版
https://www.bilibili.com/video/BV1sd4y1x7KN/?spm_id_from=333.999.0.0&vd_source=c2be79bc3abc8c9584470d3fed5d994e

反转链表需要三个节点: pre, cur, nxt

  1. 此题需要创建一个虚拟头节点dummy(要学会这么使用),它的next指向head。这样做的好处是即使left是1(即从头节点开始翻转),也能统一处理,不需要额外判断特殊情况。
  2. 通过循环将p0移动到第left-1个节点。此时,p0.next就是需要翻转的起点节点。
  3. 一开始pre为None,cur为翻转链表的起点 (p0.next)
  4. 在right-left+1次循环中,逐个翻转cur节点的next指针,使得当前节点指向前一个节点pre。每次循环中,cur变成下一个节点,pre变成当前节点,这样逐步翻转整个子链表。
  5. 翻转结束后,cur指向原来right之后的节点,pre指向原来right节点。
  6. 通过p0.next.next = cur,将翻转后的子链表连接到原来链表中right之后的部分。通过p0.next = pre,将原来链表中left之前的部分连接到翻转后的子链表。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
p0 = dummy = ListNode(next=head)
for _ in range(left - 1):
p0 = p0.next

pre = None
cur = p0.next
for _ in range(right - left + 1):
nxt = cur.next
cur.next = pre # 每次循环只修改一个 next,方便大家理解
pre = cur
cur = nxt

# 见视频
p0.next.next = cur
p0.next = pre
return dummy.next
使用搜索:谷歌必应百度