墨风如雪博客

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

每日算法题:反转链表

2023年 5月 16日 318点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
一张图,一个世界:Seed3D 1.0如何颠覆3D生成? OpenAI重磅发布ChatGPT Atlas:告别传统浏览器的AI新纪元! DeepSeek OCR:用'眼睛'阅读长文本,AI记忆新纪元? 告别代码苦海:Manus 1.5 让你的创意以光速落地 Anthropic Haiku 4.5:这波AI性能,我愿称之为“超值”! 美团LongCat-Audio-Codec:给语音大模型装上“顺风耳”与“巧舌”
英伟达Audio2Face开源:AI给虚拟角色注入灵魂告别纸上谈兵:Meta CWM让AI代码真正活起来告别指令,迎接AI同事!Kimi“OK Computer”模式震撼登场AI视频革命奇点:Sora 2的数字幻境就它了!Claude Sonnet 4.5:AI编程与智能体的新王牌Ling-1T:蚂蚁百灵如何以“非思考”策略,开启万亿参数效率新篇章?
每日算法题:反转链表 硬核拆解DeepSeek V3.1:当6850亿参数学会“分身术” 抽象类和接口的区别(通俗易理解) 如何使用Java原子类实现自旋锁和读写锁? 智谱CoCo:告别“金鱼记忆”,企业AI真能干活了! JVM进阶使用:垃圾回收机制详解
标签聚合
AI 教程 spring java 设计模式 大模型 算法 deepseek

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

Theme Kratos Made By Seaton Jiang