链表就像一列火车,每节车厢(节点)有两个部分:
在 Python 中,可以用类表示:
python展开代码class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 值
self.next = next # 指向下一个节点的指针
例如,链表 1 -> 2 -> 3 就是三个节点,每个的“钩子”连向下一个。
反转链表就是把所有“钩子”的方向调转。比如:
展开代码原链表:1 -> 2 -> 3 -> None 反转后:3 -> 2 -> 1 -> None
每个节点的“钩子”从指向下一个,变成指向前一个。
逐个节点调整指针方向,需要三个变量帮忙记录位置。
prev:记录前一个节点,初始是空(None)。current:当前处理的节点,初始是头节点。next_node:临时保存下一个节点,防止“钩子”断了找不到路。每次循环:
next_node = current.next)current.next = prev)prev 和 current 都往后移动一步当 current 为空时,prev 就是新头节点。
python展开代码def reverseList(head):
prev = None
current = head
while current:
next_node = current.next # 先记住下一个节点
current.next = prev # 反转指针
prev = current # prev 移到当前节点
current = next_node # current 移到下一个节点
return prev # 循环结束,prev 是新的头
反转 1 -> 2 -> 3:
prev=None, current=12,1 指向 None,prev=1,current=23,2 指向 1,prev=2,current=3None,3 指向 2,prev=3,current=None 结束循环。最终链表是 3 -> 2 -> 1先让后面的节点反转好,再调整当前节点。
2 -> 3,反转成 3 -> 2)。1 的下一个节点 2 已经指向 None,需要让 2 指向 1,然后 1 指向 None。python展开代码def reverseList(head):
if not head or not head.next: # 空或只有一个节点
return head
new_head = reverseList(head.next) # 先处理后面的节点
head.next.next = head # 让后面的节点指向自己
head.next = None # 自己的指针设为空
return new_head
反转 1 -> 2 -> 3:
3 时返回,new_head=32 的递归层:让 2.next(3) 指向 2,2 指向 None,此时链表是 3 -> 2 -> None1 的递归层:让 1.next(2) 指向 1,1 指向 None,最终链表是 3 -> 2 -> 1 -> None| 方法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
|---|---|---|---|---|
| 迭代法 | O(n) | O(1) | 效率高,适合长链表 | 逻辑稍复杂 |
| 递归法 | O(n) | O(n) | 代码简洁,易于理解 | 可能栈溢出,空间占用大 |
用辅助函数将链表转为列表,方便验证:
python展开代码def list_to_array(head):
res = []
while head:
res.append(head.val)
head = head.next
return res
# 测试
# 创建链表 1->2->3
head = ListNode(1, ListNode(2, ListNode(3)))
reversed_head = reverseList(head)
print(list_to_array(reversed_head)) # 输出 [3, 2, 1]
通过逐步调整指针方向,无论是迭代还是递归,最终都能实现链表的反转。理解指针的变化是关键!


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!