链表排序--(奇数位是升序,偶数位是降序)

题目描述

对一个单链表进行排序,但这个链表有一个特殊的结构:

奇数位是升序:链表中位于奇数位置的节点是按升序排列的。例如,如果链表的第1个节点的值是1,第3个节点的值是3,第5个节点的值是5,那么这些值是按升序排列的。

偶数位是降序:链表中位于偶数位置的节点是按降序排列的。例如,如果链表的第2个节点的值是8,第4个节点的值是6,第6个节点的值是4,那么这些值是按降序排列的。

示例

假设我们有一个链表如下:

1 -> 8 -> 3 -> 6 -> 5 -> 4 -> nullptr

● 奇数位:第1个节点是1,第3个节点是3,第5个节点是5。这些节点的值是 1, 3, 5,它们是升序的。

● 偶数位:第2个节点是8,第4个节点是6,第6个节点是4。这些节点的值是 8, 6, 4,它们是降序的。

排序目标

要将这个链表重新排列成一个完全升序的链表

思路分析

  1. 分离链表:首先将链表分成两个链表,一个包含奇数位节点,另一个包含偶数位节点。

  2. 反转偶数位链表:由于偶数位是降序的,我们可以将偶数位链表反转,使其变为升序。

  3. 合并链表:将两个升序的链表合并成一个完全升序的链表。

分离链表

反转偶数位链表

合并两个有序链表

最终排序结果

对于上面的示例链表,排序后的链表应该是:

1 -> 3 -> 4 -> 5 -> 6 -> 8 -> nullptr

这个链表中的所有节点都是按升序排列的。

完整代码

#include <iostream>
using namespace std;

// 定义链表节点结构
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

// 分离链表为奇数位和偶数位
pair<ListNode*, ListNode*> splitList(ListNode* head) {
    ListNode* oddHead = nullptr;
    ListNode* evenHead = nullptr;
    ListNode* oddTail = nullptr;
    ListNode* evenTail = nullptr;
    int index = 1;

    while (head) {
        if (index % 2 == 1) { // 奇数位
            if (!oddHead) {
                oddHead = head;
                oddTail = head;
            }
            else {
                oddTail->next = head;
                oddTail = oddTail->next;
            }
        }
        else { // 偶数位
            if (!evenHead) {
                evenHead = head;
                evenTail = head;
            }
            else {
                evenTail->next = head;
                evenTail = evenTail->next;
            }
        }
        head = head->next;
        index++;
    }

    if (oddTail) oddTail->next = nullptr;
    if (evenTail) evenTail->next = nullptr;

    return { oddHead, evenHead };
}

// 反转链表
ListNode* reverseList(ListNode* head) {
    auto newhead = new ListNode(0);
    auto p = head;
    while (p) {
        auto q = p->next;
        p->next = newhead->next;
        newhead->next = p;
        p = q;
    }
    return newhead->next;
}

// 合并两个升序链表
ListNode* mergeLists(ListNode* l1, ListNode* l2) {
    auto newhead = new ListNode(0);
    auto tail = newhead;

    while (l1 && l2) {
        if (l1->val < l2->val) {
            tail->next = l1;
            l1 = l1->next;
        }
        else {
            tail->next = l2;
            l2 = l2->next;
        }
        tail = tail->next;
    }

    tail->next = l1 ? l1 : l2;

    return newhead->next;
}

// 主函数:对链表进行排序
ListNode* sortLinkedList(ListNode* head) {
    if (!head || !head->next) return head;

    // 保存 splitList 的结果
    pair<ListNode*, ListNode*> splitResult = splitList(head);
    ListNode* oddHead = splitResult.first;   // 提取奇数位链表
    ListNode* evenHead = splitResult.second; // 提取偶数位链表
   

    // 反转偶数位链表
    evenHead = reverseList(evenHead);

    // 合并两个升序链表
    return mergeLists(oddHead, evenHead);
}

// 打印链表
void printList(ListNode* head) {
    while (head) {
        cout << head->val << " -> ";
        head = head->next;
    }
    cout << "nullptr" << endl;
}

// 测试代码
int main() {
    ListNode* head = new ListNode(1);
    head->next = new ListNode(8);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(6);
    head->next->next->next->next = new ListNode(5);
    head->next->next->next->next->next = new ListNode(4);

    cout << "Original List: ";
    printList(head);

    ListNode* sortedHead = sortLinkedList(head);

    cout << "Sorted List: ";
    printList(sortedHead);

    return 0;
}

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型

本教程将指导你如何在 Linux 系统上安装 Ollama&#xff08;一个本地运行大型语言模型的工具&#xff09;&#xff0c;并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型&#xff0c;适用于多种自然语言处理任务。 DeepSeek-R1 简介 DeepSeek-R1 是 DeepSeek …

arduino学习

一、log日志 只看自己 看指定 看错误日志 二、布局 重要&#xff1a;新建activity时需要的配置 若一个工程中有多个activity&#xff0c;需要修改开启activity属性、总容器标签、debug启动activity。下面流程内截图activity不一致&#xff0c;根据自己新建的activity配置&am…

obsidian插件——Metadata Hider

原本是要找导出图片时显示属性的插件&#xff0c;奈何还没找到&#xff0c;反而找到了可以隐藏属性的插件。唉&#xff0c;人生不如意&#xff0c;十之八九。 说一下功能&#xff1a; 这个插件可以把obsidian的文档属性放在右侧显示&#xff0c;或者决定只显示具体几项属性&a…

SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)

导言 SimpleFOC STM32教程09&#xff5c;基于STM32F103CubeMX&#xff0c;ADC采样相电流 如上图所示, 增加了电流环. 效果如下&#xff1a; 20250123-200906 RTT 如上图所示&#xff0c;三相占空比依然是马鞍波。当我用手去给电机施加阻力时&#xff0c;PID要维持目标转速&am…

Qt 5.14.2 学习记录 —— 이십일 Qt网络和音频

文章目录 1、UDP带有界面的Udp服务器&#xff08;回显服务器&#xff09; 2、TCP回显服务器 3、HTTP客户端4、音频 和Linux的网络一样&#xff0c;Qt封装了Linux的网络API&#xff0c;即Socket API。网络编程是在应用层写&#xff0c;需要传输层支持&#xff0c;传输层有UDP和T…

【C语言基础】编译并运行第一个C程序

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 编译并运行第一个C程序一、编译上面的程序二、运行上面的程序…

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架&#xff0c;通过多层次的开放能力提供统一接入标准&#xff0c;实现三方框架快速…

STM32 按键密码系统的实现

本次基于STM32F407开发板&#xff0c;来实现密码系统&#xff0c;输入四位密码&#xff0c;密码正确时LED1亮&#xff0c;密码错误时四个LED灯双闪。 LED双闪代码 简单的逻辑&#xff0c;让四个LED灯先亮然后再延时一会LED灯灭&#xff0c;循环4此实现双闪的效果。 按键密码的…

【C++ 动态规划】1024. 视频拼接|1746

本文涉及知识点 C动态规划 LeetCode1024. 视频拼接 你将会获得一系列视频片段&#xff0c;这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠&#xff0c;也可能长度不一。 使用数组 clips 描述所有的视频片段&#xff0c;其中 clips[i] [starti, end…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…

Oracle-Java JDBC 连接超时之后的认知纠正

背景 偶然读到熊老师的文章《老熊的三分地-JDBC中语句超时与事务》了解到&#xff1a;JAVA代码的最后正常断开数据库连接&#xff0c;在默认情况下&#xff0c;正常断开的数据库连接会自动提交没有提交的事务。   通过文章的测试JAVA程序&#xff0c;可以表明&#xff0c;JDB…

redis的分片集群模式

redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性&#xff0c;但是还有2个问题没有解决&#xff1a; &#xff08;1&#xff09;海量数据存储 &#xff08;2&#xff09;高并发写的问题 使用分片集群可解决&#xff0c;分片集群…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

【论文复现】基于维度狩猎学习的改进秃鹰搜索算法用于自动驾驶问题

目录 1.摘要2.秃鹰搜索算法BES原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 由于道路曲率穿透和参数不确定性带来的侧向偏差&#xff0c;自动驾驶车辆控制器面临提供准确、快速响应及小幅超调等性能挑战。本文提出了一种基于维度狩猎学习&#xff08;DLH&#xff09;…

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…

电路研究9.2——合宙Air780EP使用AT指令

这里正式研究AT指令的学习了&#xff0c;之前只是接触的AT指令&#xff0c;这里则是深入分析AT指令了。 软件的开发方式&#xff1a; AT&#xff1a;MCU 做主控&#xff0c;MCU 发 AT 命令给模组的开发方式&#xff0c;模组仅提供标准的 AT 固件&#xff0c; 所有的业务控制逻辑…

输入带空格的字符串,求单词个数

输入带空格的字符串&#xff0c;求单词个数 __ueooe_eui_sjje__ ---->3syue__jdjd____die_ ---->3shuue__dju__kk ---->3 #include <stdio.h> #include <string.h>// 自定义函数来判断字符是否为空白字符 int isSpace(char c) {return c || c \t || …

基于Mybatis继承AbstractRoutingDataSource使用自定义注解实现动态数据源

一&#xff1a;实现 方式一&#xff1a;继承AbstractRoutingDataSource使用自定义注解实现 环境&#xff1a;springboot3 MyBatis3 mysql-connector8 DataSourceKeyEnum枚举类 有几个数据源就配置几个枚举类&#xff0c;和数据源数量一一对应 class DataSourceKeyEnum{D…

简单树形菜单

引言 在网页开发中&#xff0c;树形菜单是一种非常实用的&#xff0c;它可以清晰地展示具有层级关系的数据&#xff0c;并且能够方便用户进行导航和操作。 整体思路 整个项目主要分为三个部分&#xff1a;HTML 结构搭建、CSS 样式设计和 JavaScript 交互逻辑实现。通过 XMLHt…