首页 > 其他分享 >LeetCode题练习与总结:奇偶链表--328

LeetCode题练习与总结:奇偶链表--328

时间:2024-10-21 22:21:06浏览次数:3  
标签:奇偶 奇数 -- 偶数 next 链表 节点 指针

一、题目描述

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

示例 1:

输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]

示例 2:

输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]

提示:

  • n ==  链表中的节点数
  • 0 <= n <= 10^4
  • -10^6 <= Node.val <= 10^6

二、解题思路

  1. 创建两个哑节点(dummy node),分别用于连接奇数节点和偶数节点。哑节点的下一个节点分别是奇数链表的头节点和偶数链表的头节点。
  2. 使用两个指针 odd 和 even 分别指向奇数节点和偶数节点的当前末尾。
  3. 遍历原始链表,根据节点的索引是奇数还是偶数,将节点分别添加到奇数链表和偶数链表的末尾。
  4. 遍历结束后,将偶数链表的头节点连接到奇数链表的末尾。
  5. 返回奇数链表的头节点(即哑节点的下一个节点)。

三、具体代码

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null) return null;

        // 创建两个哑节点
        ListNode odd = new ListNode(0);
        ListNode even = new ListNode(0);
        // 初始化两个指针分别指向奇数链表和偶数链表的末尾
        ListNode oddTail = odd, evenTail = even;
        // 当前节点的索引
        int index = 1;

        while (head != null) {
            if (index % 2 == 1) {
                // 奇数索引,添加到奇数链表
                oddTail.next = head;
                oddTail = oddTail.next;
            } else {
                // 偶数索引,添加到偶数链表
                evenTail.next = head;
                evenTail = evenTail.next;
            }
            // 移动到下一个节点
            head = head.next;
            index++;
        }

        // 将偶数链表连接到奇数链表的末尾
        oddTail.next = even.next;
        // 断开偶数链表的末尾,防止形成环
        evenTail.next = null;

        // 返回重新排序的链表头节点
        return odd.next;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历链表:代码中有一个 while 循环,该循环会遍历链表中的每个节点一次。因此,这个循环的时间复杂度是 O(n),其中 n 是链表中的节点数。
  • 在循环内部,我们进行了一些常数时间的操作(如判断索引的奇偶性、更新指针等),这些操作的时间复杂度都是 O(1)。
  • 因此,总的时间复杂度是 O(n),因为我们只遍历了一次链表。
2. 空间复杂度
  • 代码中使用了固定数量的额外空间,即创建了两个哑节点 odd 和 even,以及两个指针 oddTail 和 evenTail。无论输入链表的大小如何,这些额外空间的大小都是固定的。
  • 除了这些额外的变量,我们没有使用任何其他与链表大小相关的数据结构(如数组、哈希表等)。
  • 因此,空间复杂度是 O(1),表示额外空间的使用量不随输入链表的大小而变化。

五、总结知识点

  • 链表(Linked List)

    • 链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
    • 链表的节点通过指针连接,不需要连续的内存空间。
  • 哑节点(Dummy Node)

    • 哑节点是一种技巧,通常用于简化边界条件处理,使得代码更加简洁。
    • 在本代码中,哑节点用于简化对链表头部的操作,无需单独处理头节点的情况。
  • 指针(Pointer)

    • 指针用于在内存中存储和访问地址。
    • 在链表操作中,指针用于遍历和修改节点之间的连接关系。
  • 循环(Loop)

    • while 循环用于遍历链表中的所有节点。
    • 循环内部进行条件判断和节点指针的更新。
  • 条件判断(Conditional Statements)

    • if-else 语句用于根据节点索引的奇偶性将节点分配到不同的链表。
  • 算术运算(Arithmetic Operations)

    • 取模运算 % 用于判断索引的奇偶性。
  • 递增操作(Increment Operation)

    • index++ 用于在每次循环时递增索引。
  • 链表连接(Linking Lists)

    • 通过更新节点的 next 指针,将奇数链表和偶数链表连接起来。
  • 链表断开(Breaking Links in a List)

    • 将偶数链表的末尾节点的 next 指针设置为 null,以防止形成环。
  • 返回值(Return Value)

    • 函数返回重新排序后的链表的头节点,即哑节点的下一个节点。
  • 空指针检查(Null Pointer Check)

    • 在函数开始时检查头节点是否为 null,以处理空链表的情况。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:奇偶,奇数,--,偶数,next,链表,节点,指针
From: https://blog.csdn.net/weixin_62860386/article/details/143064522

相关文章

  • 图论模板
    最短路(dijkstra)无法处理负边权,时间复杂度O(mlogn)#include<bits/stdc++.h>#definefo(i,a,b)for(ll(i)=(a);(i)<=(b);(i)++)#definefd(i,b,a)for(ll(i)=(b);(i)>=(a);(i)--)#definelc(o<<1)#definerc((o<<1)|1)#definemk(x,y)make_pair((x),(......
  • Java中super关键词的用法和注意事项
    在Java中,super关键字用于引用当前对象的父类。它主要有以下几种用途:1.访问父类的属性和方法:当子类中定义了与父类同名的属性或方法时,可以使用super关键字来明确指出要访问的是父类中的属性或方法。2.调用父类的构造器:在子类的构造方法中,可以使用super()来显式调用父类的构造器,以......
  • 基于单片机GPS跌倒和心电老人防护监测仪系统
    **文章目录前言概要设计思路软件设计效果图程序文章目录前言......
  • 2024-10-21每日一题
    P1223排队接水题目描述有\(n\)个人在一个水龙头前排队接水,假如每个人接水的时间为\(T_i\),请编程找出这\(n\)个人排队的一种顺序,使得\(n\)个人的平均等待时间最小。输入格式第一行为一个整数\(n\)。第二行\(n\)个整数,第\(i\)个整数\(T_i\)表示第\(i\)个人的......
  • 基于单片机的人体感应智能台灯系统
    **文章目录前言概要功能设计设计思路软件设计效果图程序文章目录前言......
  • FCITX5的一些小命令
    请注意,这是我日常使用的小笔记,不一定能百分百解决问题,仅做学习参考。使用kde桌面环境,但提示fcitx的KCModule未找到,它的软件包名字有可能是kcm-fcitx5,kde-config-fcitx5(debian)或fcitx5-configtool(dnf)。这三种在ManjaroLinux上安装fcitx5时遇到依赖关系问题,可以尝试以......
  • MySQL—CRUD—进阶—(二) (ಥ_ಥ)
    文本目录:❄️一、新增: ❄️二、查询:       1、聚合查询:             1)、聚合函数:             2)、GROUPBY子句:             3)、HAVING子句:      2、联合查询:  ......
  • 为什么有时候用 translate 来改变位置, 而不是定位方式? (如top, left)
    在前端开发中,我们有时候会选择使用translate来改变元素的位置,而不是使用传统的定位方式(如top,left,right,bottom),主要是因为性能方面的考虑。具体来说,translate是通过CSS中的transform属性实现的,它操作的是元素的渲染层,而不是布局层。ps:这里的渲染......
  • 优先级队列(priority_queue)
     priority_queue简介   优先级队列的底层结构其实就是堆,就是我们在学习二叉树的时候学习的堆。它是一种逻辑结构,底层还是vector,我们把它想象成一个堆结构。    我们在学习堆的时候,知道了它的父亲和左右孩子的关系。它如果存在孩子,则一定存在这一种关系,leftchi......
  • 用HTML构建酷炫的文件上传下载界面
    1.基础HTML结构首先,我们构建一个基本的HTML结构,包括一个表单用于文件上传,以及一个列表用于展示已上传文件:HTML<!DOCTYPEhtml><html><head><title>酷炫文件上传下载</title><linkrel="stylesheet"href="style.css"></head><body>......