206. 反转链表

206. 反转链表

题目链接:206. 反转链表

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

核心思考:双指针迭代

反转链表是链表操作的基石之一。
核心思想是要改变指针的方向:让当前的节点不再指向下一个节点,而是指向上一个节点。
为了做到这一点而不丢失后续节点的位置,我们需要使用三个指针来实现迭代过程:

  1. pre:指向已经反转好部分的头节点,初始为 None(因为新链表的尾部应指向空)。
  2. cur:当前正在处理的节点,初始为 head
  3. nxt:临时变量,用于暂存 cur 的下一个节点,防止在打断指针(执行 cur.next = pre)时丢失对链表后续元素的访问通道。

不断滑动这几个指针直到 cur 变成 None,此时 pre 恰好停留在原链表的尾节点,也就是反转后新链表的头节点。

解题思路 (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
pre = None
cur = head
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre

复杂度分析

  • 时间复杂度:O(N),其中 N 是链表中的节点总数。只需要遍历一次链表。
  • 空间复杂度:O(1),只使用了常数个指针变量。