一、K 个一组翻转链表
1.1 基础反转逻辑
处理链表问题,最基础的莫过于反转。虽然 LeetCode 206 题看似简单,但它是理解后续复杂操作的关键。核心在于维护三个指针:前驱 pre、当前 cur 和后继 nxt。
注意这里不需要额外的空间,原地修改即可。每次循环将当前节点的 next 指向前驱,然后整体后移。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head):
pre = None
cur = head
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre
1.2 部分区间反转
当需要反转链表中 [left, right] 这一段时,关键在于找到第 left-1 个节点作为新的头结点连接点。使用哨兵节点(dummy node)可以极大简化边界处理,避免单独判断头节点的情况。
思路是定位到 left 的前一个节点 p0,然后从 p0.next 开始进行标准的反转操作,直到完成 right-left+1 次迭代。最后记得把断开的尾部重新接上。
class Solution:
def reverseBetween(self, head, left, right):
p0 = dummy = ListNode(next=head)
# 移动到 left 的前一个位置
for _ in range(left - 1):
p0 = p0.next
pre =
cur = p0.
_ (right - left + ):
nxt = cur.
cur. = pre
pre = cur
cur = nxt
p0.. = cur
p0. = pre
dummy.


