[路飞]_反转链表

327 阅读2分钟

题目介绍

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1

image.png

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

示例2

image.png

输入: head = [1,2]
输出: [2,1]

示例3

输入: head = []
输出: []

提示:

解题思路

迭代法

1.使用 2 个指针 pre、cur 分别指向空节点、头节点
2.cur 节点不为空时,使用 next 节点指向 cur 节点的下一个节点
3.将 cur 节点的下一个节点指向 pre
4.pre 和 cur 指针分别向前走一步
5.重复 2-4 的步骤,直到 cur 节点为空节点
6.返回 pre 节点

2.gif

解题代码

var reverseList = function(head) {
    let pre = null, cur = head, next
    while (cur) {
        next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    }
    return pre
};

递归法

递归主要找到重复的过程和递归结束的条件

在本题中,重复的过程为链表反转的过程,我们假设当前节点之后的节点都已经反转完成,只要反转后的链表的下一个节点指向当前节点即可

结束递归的条件为当前节点为空或者当前节点的下一个节点为空

每次链表反转后的头节点应为原链表的尾节点,尾节点应为当前节点的下一个节点

3.gif

解题代码

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,直到初始头节点的下一个节点为空

4.gif

解题代码

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
[路飞]_快乐数