24. 反转链表
题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:

输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
求解
(1)迭代
js
var reverseList = function(head) {
// 定义两个节点,一个指向 前一个,一个指向下一个,直到遍历完
let pre = null // 最开始,前一个是null
let current = head // 当前节点
while (current) {
let next = current.next
current.next = pre
pre = current
current = next
}
return pre
};
(2)递归
核心: 假设n_{k+1}之后的已经 反向了,那么当前节点n_k,希望它的下一个节点指向它自己:n_k.next.next = n_k
js
var reverseList = function(head) {
// 递归
// 当前节点如果是n_k,那么希望n_{k+1}的下一个节点指向 n_k
// n_k.next.next = n_k
if (head === null || head.next === null) {
return head
}
let newHead = reverseList(head.next);
head.next.next = head
head.next = null
return newHead
};
补充知识点
关键字
在 JavaScript 中,关键字(Keywords)是语言本身预留的、具有特殊含义的单词。这些单词不能用作变量名、函数名、属性名或任何其他标识符。
以下是 JavaScript 中的关键字分类及完整列表:
1. 核心关键字(Core Keywords)
这些关键字在任何情况下都不能作为标识符。
| 关键字 | 说明 |
|---|---|
| break | 终止循环或 switch 语句 |
| case | switch 语句中的分支 |
| catch | 捕获 try...catch 中的异常 |
| class | 定义类 |
| const | 声明常量 |
| continue | 跳过循环的当前迭代 |
| debugger | 调试器断点 |
| default switch | 语句中的默认分支 |
| delete | 删除对象属性或数组元素 |
| do do...while | 循环 |
| else if | 语句的分支 |
| export | 导出模块成员 |
| extends | 类继承 |
| finally | try...catch 最终执行块 |
| for | for 循环 |
| function | 定义函数 |
| if | 条件语句 |
| import | 导入模块成员 |
| in | 判断属性是否存在于对象中 |
| instanceof | 判断对象是否为某个类的实例 |
| new | 创建对象实例 |
| return | 函数返回值 |
| super | 调用父类构造函数或方法 |
| switch | 分支语句 |
| this | 指向当前对象 |
| throw | 抛出异常 |
| try | try...catch语句块 |
| typeof | 判断数据类型 |
| var | 声明变量(函数作用域) |
| void | 执行表达式但不返回值 |
| while | while 循环 |
| with | 扩展作用域链(不推荐使用) |
| yield | 生成器函数暂停标志 |
2. 未来保留关键字 (Future Reserved Keywords)
这些关键字在当前 JavaScript 版本中可能没有被使用,但为了语言的未来扩展而预留。在严格模式('use strict')下,它们不能作为标识符。
| 关键字 |
|---|
| enum |
| implements |
| interface |
| let |
| package |
| private |
| protected |
| public |
| static |
| yield |
3. 严格模式下的额外限制
在严格模式下,以下标识符也被禁止作为变量名:
- arguments
- eval
总结与建议
避免使用所有关键字:即使在非严格模式下某些未来关键字可能被允许,也应避免使用,以保证代码的兼容性和可维护性。
使用合法的命名规范:
- 变量名可以包含字母、数字、_ 和 $。
- 必须以字母、_ 或 $ 开头。
- 区分大小写(var 和 Var 是不同的)。