「图解大厂面试高频算法题」链表专题-反转链表(迭代+递归)

「图解大厂面试高频算法题」链表专题-反转链表(迭代+递归)

PS: 本文为「图解大厂面试高频算法题」专题,主旨是根据“二八法则”的原理,以付出20%的时间成本,获得80%的刷题的收益,让那些想进互联网大厂的人少走些弯路。

PS: 欢迎关注我获取更多大厂面试总结。

PS: 这道题目估计是很多刷leetcode小伙伴们做的第一次,别以为这个题很简单而且是esay的就不重视它。金刀之前在大厂面试中真的遇到过这个问题,我都惊呆了竟然出这个题,说来惭愧,我竟然没写对!焯!所以大家还是要多多练习,掌握好基本功才能拿下好offer。
原题链接: https://leetcode-cn.com/problems/reverse-linked-list/

题目介绍

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

示例1

在这里插入图片描述

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

题目解答

方法一:迭代法

思路和算法

基本思路大家应该很容易想出来,每遍历一个节点的时候,把当前节点的next指针指向前一个节点,在指向前一个节点之前需要先临时存储当前节点的next节点。

图解

在这里插入图片描述

代码实现
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        while (head != null) {
            ListNode t = head.next;
            head.next = prev;
            prev = head;
            head = t;
        }
        return prev;
    }
}
复杂度分析
  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
  • 空间复杂度:O(1)。

方法二:递归法

思路和算法

首先我们改如何理解递归呢?我们假设reverseList函数可以把一个链表进行反转。
在这里插入图片描述
红色框表示由reverseList递归返回的链表
其中蓝色节点为头节点,也就是newHead
在这里插入图片描述
拿到了由reverseList返回的链表之后,我们需要把head.next节点指向head节点。因为当前head节点属于链表的最后一个节点,需要把head节点指向null,这样就完成了本次递归。
在这里插入图片描述
另外需要注意一下递归的终止条件,如果head == null 或者 head.next == null 递归就终止了。

代码实现
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}
复杂度分析
  • 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
  • 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知春路金刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值