leetcode top100挑战, 每天不鸽一道题之 反转链表(13/100)

488 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

题目描述

反转链表

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

leetcode-cn.com/problems/re…

image.png

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

image.png

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

标签

递归

解题分析

1. 迭代

直接上讲解。

这道题应该是面试里的送分题了吧。。

简单讲一下逻辑。

1  =>  2  =>  3

反转链表怎么搞?

1. 首先储存每个元素的next,prev。
2. 然后将每个元素的next 等于上一个存储的prev。

就很简单,我们手写看一下。

遍历中 ,遍历元素为 1 
首先记录 当前元素的 next = 1 => 2,
接着把当前元素的next = null, 因为第一个元素反转后 变成了倒数第一个所以没有下一个

继续遍历, 遍历元素 2
同样的,记录当前元素的next = 2 => 3,
然后把当前元素的 next 等于上一个存储的prev,


.....

直到遍历到最后一个结束。


这道题讲道理真的死背都要死背下来,你去面试的时候,万一面试官看你顺眼,觉得你是天命之子,立马给你一道反转链表作为送分题,岂不是起了作用!!!

来人上代码!!!!!

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function reverseList(head: ListNode | null): ListNode | null {
    // 记录上一个元素的next
    let prev = null 
    // head则是第一个
    let cur = head 

    while (cur) { // 当遍历中的当前元素存在
        // 记录当前元素的 next
        const next = cur.next 
        // 把当前元素的 next 改为 上一个
        cur.next = prev 
        // 继续保存
        prev = cur 
        cur = next
    }
    return prev
};

image.png

最后

从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100,第十三道题目打完收工!!