首页 > 其他分享 >LCR 024. 反转链表

LCR 024. 反转链表

时间:2024-07-13 21:44:09浏览次数:6  
标签:head LCR 反转 next 链表 024 null 节点

LCR 024. 反转链表

1、迭代

这段代码是一个用于反转单链表的Java类。下面是对代码的详细解释:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null; // 初始化前一个节点为null,因为反转后链表的最后一个节点的next应该是null
        ListNode curr = head; // 当前节点初始化为链表的头节点
        while (curr != null) { // 当当前节点不为null时,继续循环
            ListNode next = curr.next; // 保存当前节点的下一个节点
            curr.next = prev; // 将当前节点的next指向前一个节点,实现反转
            prev = curr; // 前一个节点更新为当前节点
            curr = next; // 当前节点更新为下一个节点
        }
        return prev; // 当循环结束时,prev指向新的链表头节点,返回prev
    }
}

代码逻辑解释:

  1. 初始化

    • prev 初始化为 null,因为反转后链表的最后一个节点的 next 应该是 null
    • curr 初始化为 head,即链表的头节点。
  2. 循环

    • curr 不为 null 时,继续循环。
    • 在循环内部:
      • next 保存 curr 的下一个节点。
      • curr.next 指向 prev,实现当前节点的反转。
      • prev 更新为 curr,即前一个节点更新为当前节点。
      • curr 更新为 next,即当前节点更新为下一个节点。
  3. 返回

    • 当循环结束时,prev 指向新的链表头节点,返回 prev

示例:

假设链表为 1 -> 2 -> 3 -> 4 -> 5,经过上述代码处理后,链表将变为 5 -> 4 -> 3 -> 2 -> 1

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的长度。每个节点都被访问一次。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

递归

这段代码是一个递归实现的单链表反转函数。下面是对代码的详细解释:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head; // 反转当前节点的下一个节点的next指针
        head.next = null; // 确保当前节点的next指针为null,避免产生环
        return newHead;
    }
}

代码逻辑解释:

  1. 基本情况

    • 如果链表为空(head == null)或者链表只有一个节点(head.next == null),直接返回 head。因为空链表或单个节点的链表反转后仍然是它本身。
  2. 递归调用

    • 递归调用 reverseList(head.next),反转从第二个节点开始的剩余链表部分。递归调用会一直进行,直到链表的末尾(基本情况)。
  3. 反转操作

    • 当递归调用返回时,newHead 是反转后链表的新头节点(即原链表的最后一个节点)。
    • head.next.next = head:将当前节点的下一个节点的 next 指针指向当前节点,实现反转。
    • head.next = null:将当前节点的 next 指针置为 null,断开原来的连接,确保链表的尾部正确。
  4. 返回新的头节点

    • 返回 newHead,即反转后链表的新头节点。
      注意⚠️:
      反转链表的过程中,确保反转后的链表的尾部指向 null 是至关重要的,否则链表中可能会产生环,导致无限循环或其他错误。

假设我们有一个链表 1 -> 2 -> 3 -> 4 -> 5,我们希望将其反转成 5 -> 4 -> 3 -> 2 -> 1。

在递归反转的过程中,当我们处理到节点 1 时,head 指向 1,而 head.next 指向 2。在反转操作中,我们需要将 2 的 next 指针指向 1,即 head.next.next = head。但是,如果我们不将 head.next 置为 null,那么 1 的 next 指针仍然指向 2,这样就会形成一个环 1 -> 2 -> 1,导致链表中产生环。

因此,在反转操作之后,我们必须显式地将 head.next 置为 null,以确保链表的尾部正确地指向 null,避免产生环。

示例:

假设链表为 1 -> 2 -> 3 -> 4 -> 5,经过上述代码处理后,链表将变为 5 -> 4 -> 3 -> 2 -> 1

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的长度。每个节点都被访问一次。
  • 空间复杂度:O(n),递归调用栈的深度最多为 n。

标签:head,LCR,反转,next,链表,024,null,节点
From: https://www.cnblogs.com/qianingmeng/p/18300760

相关文章

  • 2024暑假第二周总结
    运算符总结对字面量或者变量进行操作的符号算数运算符加减乘除取模取余加减乘publicclassyunsuanfu{publicstaticvoidmain(String[]args){//+System.out.println(3+2);//5//-System.out.println(3-2);//1//*......
  • 2024.07.06 hadoop学习
    这是暑假自学的第一周,在这里做一个周总结。自从考完试之后,数据库小学期也开始了,所以我在下午进行自学,这一周自学的内容是javaweb。这一周每天下午都会抽出一小时的时间学习,学习的主要内容是javaweb中的maven,连接数据库,进行CRUD开发。在学习maven的过程中,主要使用半成品框架......
  • 2024.07.13hadoop总结
    hadoop基础概念学习在这之前并不了解hadoop,甚至没怎么听人提起过,直到学习大数据技术需要hadoop和python才开始学习。               hadoop的概念还没有完全了解完全,但是它的核心是处理和存储大数据,需要在虚拟机上面进行系统的测试 ......
  • [20240618]Oracle C functions annotations.txt
    [20240618]OracleCfunctionsannotations.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/FritsHoog......
  • 2024/07/13(暑假学习hadoop第一周总结)
    在本周的学习中,我构建了学习Hadoop所需的基础环境,这包括安装虚拟机VMware和部署CentOS操作系统。这些步骤是学习Hadoop开始,也为是深入学习Hadoop技术做好前置的准备工作。下面将详细介绍如何安装VMware和部署CentOS系统:首先,我们需要下载VMware软件并进行安装。在安装过程中,请务必......
  • 2024 暑假友谊赛-热身2
    1.G-......
  • 南京大学计算理论之美 (Summer 2024)暑期学校游记
    day-nzero4338和我说有这么个暑校,报名了day0到了钟山风雨地,石头城下水南京到了南京大学(仙林校区),被硬件震撼了一波和zero4338两人互相贩卖焦虑:为啥还没预习这个,也没预习那个到了南京大学(鼓楼校区),和同学转鼓楼校区,和同学和zero4338和同学吃饭回酒店之后说预习预习,但是......
  • 福昕高级PDF编辑器专业版2024.2.0安装教程
    1、下载安装包2、双击安装程序进行安装3、修改安装位置,点击安装4、等待安装5安装完成,一定不能立即启用不要点击立即启用6、将patch的应用程序放到安装目录下面,双击启动7、点击应用8、执行完成,打开软件就可以用了如遇到福昕高级PDF编辑器失败,提示:本机已安装......
  • Spark _Exam_ 20240713
    SparkExam20240713Conclusion还可以,没有挂分(反向挂分什么鬼)。数据简直太平洋,T1放掉log,T330变80,T410%的特殊case变成30%的特殊casedp还是很不行,其他方面的思维还可以。A.不相邻集合(a)Statement称可重集合\(S\),若满足\(\forallx\inS,x-1\notinS,x+1\notinS\)......
  • 数据结构与算法学习day4之单向链表
    1.单向链表的的定义链表是有序的列表,这是它在内存中的存储,如下图所示:链表是以节点的形式存储的,是链式存储每个节点都包含两个部分,一个是data域,一个是next域指向下一个节点每个节点不一定是连续存储链表分为带头节点和不带头节点2.单向链表的实现思路(1)添加添加节点的......