墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

每日算法题:反转链表

2023年 5月 16日 314点热度 0人点赞 0条评论

题目(反转链表)

给定一个单链表的头节点 head,请将链表反转,并返回反转后的链表的头节点。

例如,给定链表 1 -> 2 -> 3 -> 4 -> 5,反转后的链表应为 5 -> 4 -> 3 -> 2 -> 1。

请编写一个函数 reverseList,实现上述功能。

函数签名如下:

public ListNode reverseList(ListNode head) {
    // TODO: 实现函数体
}

其中,ListNode 是一个单链表节点的定义:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

提示:

  • 你可以迭代或递归地反转链表。
  • 你能否用 O(1) 的空间复杂度解决此问题?

祝你好运!

解题思路和答案

链表的反转是一个经典的问题,有两种常见的解法:迭代和递归。

迭代法的思路是:从头节点开始,依次将每个节点的 next 指针指向它的前一个节点,最后返回新链表的头节点。

递归法的思路是:先递归地反转子链表,然后将当前节点的 next 指针指向前一个节点,最后返回新链表的头节点。

具体实现见下面的答案和代码。

答案:

以下是迭代法的实现:

public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

以下是递归法的实现:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}

这两种方法的时间复杂度都是 O(n),其中 n 是链表的长度。迭代法的空间复杂度是 O(1),递归法的空间复杂度是 O(n),因为递归需要使用系统栈空间。

这道题还有一个进阶问题:如何用 O(1) 的空间复杂度解决此问题?可以使用迭代法和递归法的变形解法,这里不再赘述。

完整的 Java 代码如下:

public class Solution {
    public ListNode reverseList(ListNode head) {
        // 迭代法
        // ListNode prev = null;
        // ListNode curr = head;
        // while (curr != null) {
        //     ListNode next = curr.next;
        //     curr.next = prev;
        //     prev = curr;
        //     curr = next;
        // }
        // return prev;

        // 递归法
        if (head == null || head.next == null) {
            return head;
        }
        ListNode p = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return p;
    }
}

如果需要了解完整的思路和新奇的例子,可以去力扣增强自己的算法实力。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 反转链表 指针 算法
最后更新:2023年 5月 12日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
DeepSeek OCR:用'眼睛'阅读长文本,AI记忆新纪元? 告别代码苦海:Manus 1.5 让你的创意以光速落地 Anthropic Haiku 4.5:这波AI性能,我愿称之为“超值”! 美团LongCat-Audio-Codec:给语音大模型装上“顺风耳”与“巧舌” 告别无声AI视频!谷歌Veo 3.1打造沉浸式视听盛宴 Karpathy的nanochat:百元就能造ChatGPT?AI圈炸锅了!
10秒100MB,ChatExcel一键PPT:它真把报告变“魔法”了?深思熟虑的“终章”:DeepSeek-V3.1-Terminus,不止于“完善”英伟达Audio2Face开源:AI给虚拟角色注入灵魂告别纸上谈兵:Meta CWM让AI代码真正活起来告别指令,迎接AI同事!Kimi“OK Computer”模式震撼登场AI视频革命奇点:Sora 2的数字幻境
告别“死记硬背”:Meta V-JEPA 2,让AI拥有“物理直觉”! 告别插件时代!OmniGen2:一个模型,通吃所有AIGC神操作 腾讯混元MT-7B:打破参数迷思,重塑机器翻译版图 AI视频革命奇点:Sora 2的数字幻境 常用Linux命令合集 Shadowrocket是什么和使用方法
标签聚合
设计模式 java AI 大模型 deepseek 算法 教程 spring

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang