剑指 Offer 24. 反转链表

文章目录

  • 剑指 Offer 24. 反转链表
  • 一、迭代
  • 二、递归
  • 总结

一、迭代

在遍历链表时,将当前节点的 next 指针改为指向前一个结点。由于结点没有引用其前一个结点,因此必须事先存储其前一个结点。在更改引用之前,还需要存储后一个结点。最后返回新的头引用。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
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;                    //遍历完成后,curr 为空,prev 成为头结点}
}
  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次
  • 空间复杂度:O(1)

二、递归

递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

需要注意的是 n1 的下一个结点必须指向 ∅。如果忽略了这一点,链表中可能会产生环

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution{public ListNode reverseList(ListNode head){if(head == null || head.next == null){        //递归终止条件return head;}ListNode newHead = reverseList(head.next):    //新头结点 newHead 指向尾结点,此处进入递归,递归一直遍历到尾结点时才返回head.next.next = head;         //每一层递归,该层递归中的 head 会让下一个结点指向自己head.next = null;                //然后 head 自己指向空,以此达到反转的目的return newHead;                 //返回新链表的头结点}
}
  • 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个结点进行反转操作
  • 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层

总结

第一道 LeetCode 就给我上了一课,从 7 点做到 9 点俩小时没磨出来。最后实在没办法就看题解了,迭代的方法很好理解,半小时不到就能完全理解并且复写出来。但是递归属实有点难懂,分不清是太累了脑子转不过来了还是太笨了,不过最后也还是搞懂了,将近40分钟吧,递归题理解了复写也不难

【LeetCode】剑指 Offer 24. 反转链表相关推荐

  1. Leetcode 剑指 Offer 24. 反转链表 (每日一题 20210823)

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...

  2. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  3. 【双100%解法】剑指 Offer 24. 反转链表

    立志用最少的代码做最高效的表达 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: ...

  4. 剑指offer 24. 反转链表

    1.问题描述 输入一个链表的头结点,反转链表后,输出新链表的表头. 2. 解决思路 1)链表是空的:直接返回空的头结点: 2)链表中只有一个结点:直接返回原头结点: 3)链表中有大于2个以上的结点:需 ...

  5. 剑指 Offer 24.反转链表

    题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 题目链接:反转链表 示例: 输入: 1->2->3->4->5->NULL 输出: 5-& ...

  6. 【算法】剑指 Offer 24. 反转链表

    1.概述 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof 定义一个函数,输入一个链表的头节点, ...

  7. 剑指 Offer 24. 反转链表java

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-&g ...

  8. 剑指 Offer 24. 反转链表(C语言)

    **定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...

  9. 剑指Offer 24 反转链表

    迭代的思想就是利用pre和cur两个指针,然后逐步向后遍历 # Definition for singly-linked list. # class ListNode: # def __init__( ...

最新文章

  1. STL set multiset
  2. 年中盘点:2021年最炙手可热的10家AI初创公司
  3. cass软件yy命令_WIN10系统中的CASS字体问题
  4. [原创] Robot framework 基于关键字、BDD驱动的自动化测试框架
  5. python opencv imread(filename, flags=None) 读取图像 flags cv::ImreadModes 参数上哪看去?
  6. Spring(一)——用Spring IOC容器创建对象
  7. Linux配置汇总上(北大青鸟Linux课程学习总结)
  8. JAVA单向链表实现
  9. 1971旗舰cpu intel_AMD依然yes!官宣锐龙5000系列CPU,单核性能首次超越英特尔,苏妈:最好的游戏CPU!...
  10. Java中HttpURLConnection使用代理服务器
  11. 用acdsee制作html,ACDsee教程:ACDSee的HTML相册生成
  12. 多通道ECG心率监测系统
  13. Git-Clone succeeded, but checkout failed
  14. a-btest 数据挖掘_挖掘新的垂直鼠标-帮助我的腕管
  15. php 生日提醒,PHP中实现简单的生日提醒功能实例,简单又实用!
  16. 解决“error: failed to push some refs to ‘git@gitee.com:username/repo.git‘“
  17. 不花里胡哨看电脑主板支持最大内存与频率
  18. 【精选】表情包斗图小程序(可引流,开通流量主,权益外卖cps,带pc后台管理)
  19. C++中的RVO、NRVO与Copy Elision
  20. Linux内存管理:HighMemory

热门文章

  1. python填充_python 实现矩阵填充0的例子
  2. mlp参数调整_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
  3. oracle中常用的时间格式转换
  4. 【bzoj4868】[Shoi2017]期末考试 前缀和+暴力
  5. signalr中Group 分组群发消息的简单使用
  6. SQLLite数据库操作
  7. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)
  8. Android用户界面
  9. Linux内存管理之内存管理单元(MMU)(二)
  10. c语言存储类型重要吗,C语言储存类别(Storage Class)