墨风如雪博客

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

每日算法题:反转链表

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

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
1美元雇佣顶级架构师?MiniMax M2.5要把Agent价格打穿 那个霸榜的Pony Alpha现身了:智谱GLM-5硬刚Claude Opus 纯国产算力硬刚GPT?聊聊刚发布的讯飞星火X2 阿里Qwen-Image-2.0实测:终于有一款能听懂人话、写对汉字的AI了 别再等Sora了,字节Seedance 2.0才是AI视频的“导演时刻” Mistral 掀桌子:40亿参数跑本地,Voxtral 2 把延迟压进了200毫秒
1美元雇佣顶级架构师?MiniMax M2.5要把Agent价格打穿
AI“神医”的开源盛宴?谷歌医疗大模型MedGemma来了! 刷爆AI圈!字节Waver 1.0,统一视频生成新里程碑! 免费+性能双杀!百度文心大模型4.5/X1提前上线,开启AI普惠新时代 Spring DI:依赖注入的完整指南 K8s常用命令和使用技巧(超详细) Llama 4:参数屠榜还是数据注水?AI 圈的最新‘瓜’熟了没?
标签聚合
设计模式 教程 算法 spring 开源 大模型 java AI

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

Theme Kratos Made By Seaton Jiang