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),只使用了常数个指针变量。

ACM 模式

本节提供 ACM 竞赛风格的完整可运行代码,包含输入输出处理。

输入格式:

1
num1 num2 num3 ... numN

输入一行整数数组,以空格分隔。

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys

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

def main():
nums = list(map(int, sys.stdin.read().strip().split()))

sol = Solution()
result = sol.reverseList(nums)
for v in result:\n print(v, end=' ')\n print()

if __name__ == "__main__":
main()

运行示例:

1
echo "2 -1 3 4 -5" | python solution.py