该系列题目取自 LeetCode 精选 TOP 面试题列表:leetcode-cn.com/problemset/…
如果你对做题或分享题解感兴趣,欢迎加入 LeetCode 刷题小组~👏
题目描述
LeetCode 206. 反转链表:leetcode-cn.com/problems/re…
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路
链表反转在面试中非常常见,我也在面试中遇到过这道题。在本篇文章中我们先说说如何用迭代法求解该题。
在反转的过程中:
- 为了反转,我们需要知道节点的上一个节点
- 为了继续遍历,我们也需要知道节点的下一个节点
因此,在循环迭代节点的过程中需执行如下步骤(设当前节点为 cur):
- 保存节点的前一个节点
pre - 保存节点的下一个节点
next - 修改节点的 next 指针,使它指向前一个节点
cur.next = pre
以题目中给出的 1->2->3->4->5->NULL 为例,反转过程如下:

⚠️需要注意的是:
- 为了进行下一轮遍历,在修改
next指针前需要先保存下一个节点 - 反转结束后,最终要返回的节点为原链表的最后一个节点
具体实现
Python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None
while head:
# 获取下一个节点
next_node = head.next
# 改变下一个节点
head.next = pre
# 修改 pre
pre = head
# 修改 head
head = next_node
return pre
Go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
var pre *ListNode
for head != nil {
next := head.Next
head.Next = pre
pre = head
head = next
}
return pre
}
复杂度
- 时间复杂度
- 空间复杂度
总结
反转链表的关键在于保存好上一个节点,并处理好 next 指针的修改时机。
关于本题的递归求解的方式,我们下期再聊~
往期回顾
- 图解精选 TOP 面试题 001 | LeetCode 237. 删除链表中的节点
- 图解精选 TOP 面试题 002 | LeetCode 104. 二叉树的最大深度
- 图解精选 TOP 面试题 003 | LeetCode 344. 反转字符串
- 图解精选 TOP 面试题 004 | LeetCode 108. 将有序数组转换为二叉搜索树
推荐阅读
🐱
如果你觉得文章写得不错,请帮我两个小忙:
- 点赞并关注我,让这篇文章被更多人看到
- 关注公众号「编程拯救世界」,公众号专注于编程基础与服务端研发,你将第一时间获得新文章的推送~
原创不易,多多鼓励~谢谢大家!
