Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给你单链表的头节点 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.递归
递归的方式相对于比较困难,需要解决出现的闭环情况,所以我们需要在返回的前一步进行 head.next = null 的操作。
还有在遇到当前节点为null 或者是 当前节点的next节点的值为null时,返回当前节点。
const reverseList = (head) => {
if (head == null || head.next == null) {
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
2.迭代 || 双指针
这个算是 双指针 也算是 迭代。
每次循环,判断fast指针的值是否还存在,如果不存在,则结束循环。
-
每次循环,先保留fast指针的值 给 慢指针 slow,此时的 慢指针slow的值的头,就是当前的值。
-
之后让fast指针向前走。
-
newHead 意思就是新的翻转链表,将翻转链表 newHead ,每次赋值给 慢指针的 slow.next。此时的慢指针slow 就是翻转的值
-
我们再重新赋值给 newHead
-
最后返回 newHead ,就是最终翻转后的链表的结果
const reverseList = (head) => {
let newHead = null
let fast = head
let slow = null
while (fast) {
slow = fast
fast = fast.next
slow.next = newHead
newHead = slow
}
return newHead
}
总结
该题目 16 :递归, 迭代 不同方式的解题方法,在链表中的应用。