(中等)LeetCode 328. 奇偶链表 Java

news2024/11/27 10:37:07

在这里插入图片描述
对于链表中有零个、一个、两个节点的情况,直接返回即可

对于链表的节点数大于两个的情况,需要讨论,看当前节点是第奇数个节点还是第偶数个节点

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return head;
        }

        int cnt = 1;
        ListNode lastNode = head;
        while (lastNode.next != null) {
            cnt++;
            lastNode = lastNode.next;
        }

        int i = 1;
        ListNode p = head;
        ListNode pre = head;
        while (i <= cnt) {
            //第奇数个节点
            if ((i & 1) == 1) {
                pre = p;
                p = p.next;
            } else {
                //第偶数个节点
                pre.next = p.next;
                lastNode.next = p;
                lastNode = lastNode.next;
                lastNode.next = null;
                p = pre.next;
            }
            i++;
        }
        return head;
    }
}

这种方法是一边遍历一边处理

另一种方法,分离节点后合并

如果链表为空,则直接返回链表。

对于每个链表,每个节点是奇数节点或者偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶数节点分离成奇数链表和偶数链表,然后将偶数链表连接在奇数链表之后,合并后的链表即为结果链表。

原始链表的头节点head也是奇数链表的头节点以及结果链表的头节点,head的后一个节点是偶数链表的头节点。令evenHead=head.next,则evenHead是偶数链表的头节点。

维护两个指针odd和even分别指向奇数节点和偶数节点,初始时odd=head,even=evenHead。通过迭代的方式将奇数节点和偶数节点分离成两个链表,每一步首先更新奇数节点,然后更新偶数节点。

  • 更新奇数节点时,奇数节点的后一个节点需要指向偶数节点的后一个节点,因此odd.next=even.next,然后令odd=odd.next,此时odd变成even的后一个节点
  • 更新偶数节点时,偶数节点的后一个节点需要指向奇数节点的后一个节点,因此,令even.next = odd.next,然后令even=even.next,此时,even变成odd的后一个节点

在上述操作完成以后,就完成了对一个奇数节点和一个偶数节点的分离。重复上述操作,直到全部节点分离完毕。全部节点分离完毕的条件是even为空节点或者even.next为空节点,此时odd指向最后一个奇数节点(即奇数链表的最后一个节点)

最后令odd.next=evenHead,将偶数链表连接在奇数链表之后,即完成了奇数链表和偶数链表的合并,结果链表的头节点仍然是head

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return head;
        }
        ListNode evenHead = head.next;
        ListNode odd = head;
        ListNode even = evenHead;
        //也就是当even或者even.next=null时,退出循环
        //因为even=null退出循环,应该是链表有奇数个节点
        //因为even.next=null退出循环,应该是链表有偶数个节点
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中n是链表的节点数,需要遍历链表中的每个节点,并更新指针
  • 空间复杂度:O(1),只需要维护有限的指针
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin Glide预加载&#xff0c;加载到磁盘或者内存缓存&#xff0c;然后加载的图片只从缓存&#xff08;磁盘缓存或者内存缓存&#xff09;中取。 private val imageFile File("/storage/emulated/0/DCIM/Ca…

百科创建必看攻略!人物百度百科怎么创建?5分钟教会你创建人物百度百科词条

百度人物百科是一个广受欢迎的在线百科平台&#xff0c;它为用户提供了一个便捷的方式来了解各种各样的人物信息。如果你有一个人物的详细资料&#xff0c;你可以通过创建一个百度人物百科页面来分享这些信息。 下面是分媒互动分享的创建百度人物百科页面的步骤以及需要注意的几…

ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap &#xff0c;我们创建 ConfigMap 的时候可以传入单个或者多个键值对&#xff0c;也可以传入文件&#xff0c;还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量 我们补充一下使用 ConfigMap 一次性传递多个条目吧 一…

直击现场|Sui Builder House巴黎站倒计时0天

Sui Builder House下一站即将在法国巴黎举行&#xff0c;为世界各地的开发人员提供在这座被誉为“City of Light”的城市学习和交流的机会。 Sui Builder House将于7月18–19日在巴黎举行&#xff0c;这是展示Sui突破性技术的绝佳机会。在丹佛Builder House活动之后&#xff0c…

PCIe总线的链路训练

目录 概述 链路训练的目的 几个关键概念 Lane reveral &#xff1a; Polarity inversion&#xff1a; De-skew&#xff1a; link number&#xff1a; Lane number&#xff1a; Bit lock&#xff1a; Symbol lock&#xff1a; 几个特殊序列&#xff1a; TS1和TS2&am…

深度学习系列8——分类模型评估指标

1. 概述 1.1 分类 分类&#xff1a;标签为离散值。 回归&#xff1a;标签为连续值。 2. 混淆矩阵 二分类的混淆矩阵&#xff1a; TP 和 TN 为网络预测正确的部分&#xff0c;FP 和 FN 为网络预测错误的部分。 3. 二级指标 准确率&#xff1a; 针对模型的整体评估&#xf…

Java基础之复习笔记(上)

目录 一、Java是什么&#xff1f; &#x1f496;Java概念 &#x1f496;Java运行机制 二、Java的语言基础 &#x1f496;关键字 &#x1f496;基本数据类型 &#x1f496;运算符 三、Java逻辑控制 &#x1f496;分支结构 &#x1f496;循环结构 四、Java的方法 &#…

嵌入式基础知识-系统调度

系统调度是操作系统重要功能&#xff0c;在嵌入式开发&#xff0c;也要了解系统调度的基本原理。对于嵌入式Linux开发&#xff0c;一般使用多线程和多进程开发&#xff0c;对于运行RTOS的嵌入式系统&#xff0c;一般使用多任务开发。这些线程、进程、任务的调度&#xff0c;有许…

RS232转Profinet网关怎么设置

大家好&#xff0c;今天我要给大家带来一个很有意思的案例分享。你们猜猜&#xff0c;这回我们要用远创智控的一款神奇的网关YC-RSPN-002做什么呢&#xff1f;没错&#xff0c;我们要把一台扫码枪设备通过这个RS232转PROFINET网关&#xff0c;接入到一台西门子S7-1200PLC的Prof…

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?

在这个高度自动化的时代&#xff0c;为什么自动化测试取代不了手功测试&#xff1f;06:1101自动化测试和手工测试的概念 自动化测试和手工测试都是软件测试的两种基本方法。 自动化测试是基于脚本或工具自动执行测试用例的过程。测试人员可以使用自动化测试工具来编写测试脚本…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 1.输入正确的用户名和密码&#xff0c;点击提交按钮&#xff0c;验证是否能正确登录。&#xff08;正常输入&#xff0…

C语言 替换gets函数

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 替换gets函数 gets()用处 gets从标准输入设备读字符串函…

noSQL的小练习

目录 Redis&#xff1a; 1、 string类型数据的命令操作&#xff1a; 2、 list类型数据的命令操作&#xff1a; 3、 hash类型数据的命令操作&#xff1a; MongoDB&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若…

Redis分片集群有什么作用?怎样读取和存储信息

分片集群主要解决的是&#xff0c;海量数据存储的问题&#xff0c;集群中有多个master&#xff0c;每个master保存不同数据&#xff0c;并且还可以给每个master设置多个slave节点&#xff0c;就可以继续增大集群的高并发能力。同时每个master之间通过ping监测彼此健康状态&…

Selenium中如何抓取网络请求响应及WebSocket信息

目录 获取Chrome性能日志 获取请求及响应信息 我们在使用Selenium测试Web或Electronjs/Cef框架应用时&#xff0c;有时候操作一个元素需要判断是否发送了请求以及请求的参数是否正确 我们可以通过&#xff0c;开启Chrome的性能日志来然后配合driver.get_log("performan…

qgis添加地理地图书签,快速定位到想要的位置

我们打开qgis软件&#xff0c;一般这个功能区域默认在左侧的中间位置&#xff0c;如图&#xff1a; 如果没有的话&#xff0c;我们需要调出来&#xff0c;在软件上方的菜单栏的空白处&#xff0c;右键显示面板调试框&#xff0c;勾选空间书签管理器面板&#xff0c;即可&…

6.3.4 利用Wireshark进行协议分析(四)----ARP协议解析

6.3.4 利用Wireshark进行协议分析&#xff08;四&#xff09;----ARP协议解析 我们知道对于单跳网络内部的数据传输&#xff0c;使用的是网络接口层的技术&#xff0c;比如以太网技术&#xff0c;以太网将报文数据封装在数据帧中进行传送&#xff0c;帧头指明发送方网卡的地址…

初学者必看!PLC转型C#上位机编程学习路线和方法

一.通过线上学习C#&#xff0c;机器视觉&#xff0c;运动控制卡&#xff0c;工程案例&#xff0c;我迈向工控软件开发的转型之路 大家好&#xff0c;我是华山编程培训中心的学员——李工&#xff0c;今天分享下我是如何从电气工程师成功转型上位机开发的经历&#xff0c;希望我…

【10】STM32·HAL库开发-MAP文件解析 | STM32启动过程

目录 1&#xff0c;MAP文件浅析&#xff08;了解&#xff09;1.1MAP文件概念和作用1.2MAP文件组成1.3MAP文件实操 2.STM32启动过程&#xff08;了解&#xff09;2.1STM32启动模式&#xff08;F1/F4/F7/H7&#xff09;&#xff08;也称自举模式&#xff09;2.1.1STM32启动模式&a…

MybatisPLus3-Activerecord

不用注入数据层对象&#xff0c;就可以实现对数据的访问和操作 具体步骤 1.实体类继承Model<实体类名> 2.mapper接口继承BaseMapper<类名> 3.通过实例化实体对象&#xff0c;就可以通过对象调用CRUD的方法 增 删除/修改/查找的方式都和上面一样