[路飞]leetcode-206.反转链表

171 阅读1分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

题目描述

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

示例:假设链表为[1,2,3],则输出[3,2,1]

解题思路

先分析边界情况,如果链表为空或者只有一个节点,则无需反转可以直接返回。

假设链表为[1, 2, 3, 4, 5]

画图如下

我们定义一个虚拟初始存储节点,

image.png

1-->2-->3-->4-->5

分析一下反转后的结果,预期如下

image.png

5-->4-->3-->2-->1

即,2的下个节点为3,3的 下个节点为4...

image.png

因此,1.next = pre、2.next = 1、3.next = 2

所以我们需要再定义两个变量,current 和 next,根据现有条件可以得到当前节点以及当前节点的下个节点,只需要将当前节点的下个节点的指向变为当前节点,

反转到最后pre节点会一直存储到最后一个节点,因此返回pre即可

ps:对于常见的一些刷题的解法,其实是有“套路”的,虚拟头节点就是其中一种,当我们多练习整理出来这种方案之后,可以对许多同等类型的题目进行“套路”,多多练习,加油哦~~

代码实现

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

以上就是反转链表的代码实现,其他相关链表题解可以查看作者历史文章,以下指路

链表基础