题目介绍
给你单链表的头节点 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 <= 5000leetcode-206 反转链表
b站视频
解题思路
迭代法
1.使用 2 个指针 pre、cur 分别指向空节点、头节点
2.cur 节点不为空时,使用 next 节点指向 cur 节点的下一个节点
3.将 cur 节点的下一个节点指向 pre
4.pre 和 cur 指针分别向前走一步
5.重复 2-4 的步骤,直到 cur 节点为空节点
6.返回 pre 节点
解题代码
var reverseList = function(head) {
let pre = null, cur = head, next
while (cur) {
next = cur.next
cur.next = pre
pre = cur
cur = next
}
return pre
};
递归法
递归主要找到重复的过程和递归结束的条件
在本题中,重复的过程为链表反转的过程,我们假设当前节点之后的节点都已经反转完成,只要反转后的链表的下一个节点指向当前节点即可
结束递归的条件为当前节点为空或者当前节点的下一个节点为空
每次链表反转后的头节点应为原链表的尾节点,尾节点应为当前节点的下一个节点
解题代码
var reverseList = function(head) {
if (head === null || head.next === null) {
return head
}
// node是反转之后的链表的头节点
const node = reverseList(head.next)
// 当前节点的下一个节点(即反转之后链表的尾节点)的下一个节点指向当前节点
head.next.next = head
// 当前节点的下一个节点指向空
head.next = null
// 返回反转之后的链表
return node
};
双指针
1.创建 cur 指针指向初始头节点
2.当初始头节点的下一个节点存在时,创建 next 节点指向初始头节点的下两个节点
3.初始头节点的下一个节点的下一个节点指向 cur
4.cur 指向 初始头节点的下一个节点
5.初始头节点的下一个节点指向 next
6.重复步骤 2-5,直到初始头节点的下一个节点为空
解题代码
var reverseList = function(head) {
if (!head) return null
let cur = head, next
while(head.next !== null) {
next = head.next.next
head.next.next = cur
cur = head.next
head.next = next
}
return cur
};
以上就是本题的解题思路,可以查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数