3
无重复字符的最长子串
中等频率: 1033
146
LRU缓存机制
中等频率: 818
206
反转链表
简单频率: 712
215
数组中的第K个最大元素
中等频率: 554
25
K个一组翻转链表
困难频率: 475
15
三数之和
中等频率: 439
53
最大子数组和
中等频率: 354
912
排序数组
中等频率: 327
21
合并两个有序链表
简单频率: 310
5
最长回文子串
中等频率: 308
200
岛屿数量
中等频率: 295
33
搜索旋转排序数组
中等频率: 290
46
全排列
中等频率: 282
88
合并两个有序数组
简单频率: 274
20
有效的括号
简单频率: 267
121
买卖股票的最佳时机
简单频率: 259
236
二叉树的最近公共祖先
中等频率: 254
92
反转链表 II
中等频率: 253
141
环形链表
简单频率: 246
300
最长上升子序列
中等频率: 240
54
螺旋矩阵
中等频率: 239
143
重排链表
中等频率: 230
23
合并K个排序链表
困难频率: 225
415
字符串相加
简单频率: 213
56
合并区间
中等频率: 211
160
相交链表
简单频率: 197
42
接雨水
困难频率: 186
1143
最长公共子序列
中等频率: 174
124
二叉树中的最大路径和
困难频率: 174
93
复原IP地址
中等频率: 171
82
删除排序链表中的重复元素 II
中等频率: 170
19
删除链表的倒数第N个节点
中等频率: 169
142
环形链表 II
中等频率: 165
4
寻找两个正序数组的中位数
困难频率: 158
199
二叉树的右视图
中等频率: 150
165
比较版本号
中等频率: 148
704
二分查找
简单频率: 140
22
括号生成
中等频率: 139
94
二叉树的中序遍历
简单频率: 139
239
滑动窗口最大值
困难频率: 137
69
x 的平方根
简单频率: 135
148
排序链表
中等频率: 135
32
最长有效括号
困难频率: 134
31
下一个排列
中等频率: 132
8
字符串转换整数 (atoi)
中等频率: 129
70
爬楼梯
简单频率: 124
322
零钱兑换
中等频率: 123
43
字符串相乘
中等频率: 120
76
最小覆盖子串
困难频率: 117
41
缺失的第一个正数
困难频率: 108
105
从前序与中序遍历序列构造二叉树
中等频率: 106
78
子集
中等频率: 102
151
翻转字符串里的单词
中等频率: 101
155
最小栈
简单频率: 96
34
在排序数组中查找元素的第一个和最后一个位置
中等频率: 94
394
字符串解码
中等频率: 91
101
对称二叉树
简单频率: 91
39
组合总和
中等频率: 89
470
用 Rand7() 实现 Rand10()
中等频率: 87
64
最小路径和
中等频率: 87
104
二叉树的最大深度
简单频率: 87
110
平衡二叉树
简单频率: 85
144
二叉树的前序遍历
简单频率: 84
48
旋转图像
中等频率: 82
234
回文链表
简单频率: 82
695
岛屿的最大面积
中等频率: 82
122
买卖股票的最佳时机 II
简单频率: 82
240
搜索二维矩阵 II
中等频率: 81
221
最大正方形
中等频率: 81
98
验证二叉搜索树
中等频率: 80
543
二叉树的直径
简单频率: 79
14
最长公共前缀
简单频率: 78
179
最大数
中等频率: 76
113
路径总和 II
中等频率: 76
662
二叉树最大宽度
中等频率: 76
62
不同路径
中等频率: 73
198
打家劫舍
中等频率: 71
152
乘积最大子数组
中等频率: 71
560
和为K的子数组
中等频率: 70
112
路径总和
简单频率: 68
226
翻转二叉树
简单频率: 67
209
长度最小的子数组
中等频率: 67
227
基本计算器 II
中等频率: 67
169
多数元素
简单频率: 67
24
两两交换链表中的节点
中等频率: 66
139
单词拆分
中等频率: 65
283
移动零
简单频率: 64
718
最长重复子数组
中等频率: 64
1
两数之和
简单频率: 5
2
两数相加
中等频率: 4

206. 反转链表

查看题目
简单
链表
递归
频率: 712

解法迭代法

时间复杂度:O(n) | 空间复杂度:O(1) | 推荐使用

动画演示

准备就绪 - 输入链表值(用逗号分隔),然后点击开始

代码实现


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
     * 迭代法反转链表
     * 使用三个指针:prev、curr、next
     */
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}
时间复杂度:O(n)
空间复杂度:O(1)
算法思路: 迭代法反转链表是一种直观且高效的解法,使用三个指针来逐步反转链表。 核心思想: 1. 使用三个指针: - prev: 指向前一个节点,初始为null - curr: 指向当前节点,初始为head - next: 指向下一个节点,用于保存curr.next 2. 遍历过程: - 保存当前节点的下一个节点(next = curr.next) - 将当前节点的next指向前一个节点(curr.next = prev) - 移动prev和curr指针(prev = curr, curr = next) - 重复直到curr为null 3. 返回结果: - prev指针指向反转后的链表头节点 复杂度分析: - 时间复杂度:O(n) - 需要遍历链表一次,每个节点访问一次 - 空间复杂度:O(1) - 只使用了三个指针变量,不依赖链表长度

解法递归法

时间复杂度:O(n) | 空间复杂度:O(n)

动画演示

准备就绪 - 输入链表值(用逗号分隔),然后点击开始

代码实现


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
     * 递归法反转链表
     * 递归到链表末尾,然后逐层返回并反转
     */
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}
时间复杂度:O(n)
空间复杂度:O(n)
算法思路: 递归法反转链表是一种优雅的解法,通过递归到链表末尾,然后逐层返回并反转链表。 核心思想: 1. 递归终止条件: - 如果head为null或head.next为null,直接返回head - 这是递归的基准情况 2. 递归过程: - 递归调用reverseList(head.next),得到反转后的新头节点newHead - 此时head.next指向的节点已经反转完成 3. 反转操作: - 将head.next.next指向head(将下一个节点的next指向当前节点) - 将head.next置为null(断开当前节点与下一个节点的连接) - 返回newHead(新的头节点) 4. 递归调用栈: - 递归会一直深入到链表末尾 - 然后从末尾开始逐层返回并执行反转操作 复杂度分析: - 时间复杂度:O(n) - 需要遍历链表一次,每个节点访问一次 - 空间复杂度:O(n) - 递归调用栈的深度为n,需要O(n)的额外空间