可视化图解算法:链表的奇偶重排(排序链表)
1. 题目
描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足 0≤n≤105,节点中的值都满足 0≤val≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:
{1,2,3,4,5,6}
返回值:
{1,3,5,2,4,6}
说明:
1->2->3->4->5->6->NULL 重排后为1->3->5->2->4->6->NULL
示例2
输入:
{1,4,6,3,7}
返回值:
{1,6,7,4,3}
说明:
1->4->6->3->7->NULL 重排后为 1->6->7->4->3->NULL 奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3
备注:
链表长度不大于200000。每个数范围均在int内。
2. 解题思路
对链表的奇偶节点进行排序,就是要更改奇数节点与偶数节点的指针域。让奇数节点的指针域指向下下节点(奇数节点指向奇数节点),偶数节点的指针域也是指向下下节点(偶数节点指向偶数节点)。最后再将奇数节点中最后一个节点的指针域指向偶数节点中的第一节点。
为了便于操作偶数节点只的第一个节点,需要定义一个虚拟头节点,此虚拟头节点的指针域指向偶数节点中的第一个节点(这样就很容易找到偶数节点的第一个节点了)。
假如排序的链表如下所示,可以通过下面的步骤完成链表奇偶节点的排序。

步骤一:定义虚拟头结点与指针变量。
分别定义奇数节点操作指针变量oddCur和偶数节点操作指针变量evenCur,以及虚拟头节点tmpHead。变量指向如下图所示:

步骤二:移动指针变量。
-
更改奇数节点指针域的指向

-
更改偶数节点指针域的指向

指针变量移动终止条件:
-
节点数量为奇数的情况:

-
节点数量为偶数的情况:

步骤三:奇数节点连接 偶数节点链表的头节点,形成一个新的链表。

如果文字描述的不太清楚,你可以参考视频的详细讲解。
-
Python版本:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1370401 -
Java版本:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1366845 -
Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1364602
3. 编码实现
核心伪代码如下:
函数 oddEvenList(头节点 head) 返回链表节点:如果 head 为空:返回 head// 1.定义虚拟头结点与指针变量odd_cur = head // 当前奇数节点指针,初始指向头节点even_cur = head.next // 当前偶数节点指针,初始指向第二个节点tmp_head = 新建节点(-1) // 偶数链的虚拟头节点tmp_head.next = even_cur // 虚拟头节点指向偶数链头部// 2. 移动指针变量(遍历并分离奇偶节点)当 even_cur 不为空 且 even_cur.next 不为空:// 2.1 更改奇数节点的指针指向odd_cur.next = odd_cur.next.nextodd_cur = odd_cur.next// 2.2 更改偶数节点的指针域even_cur.next = even_cur.next.nexteven_cur = even_cur.next// 3. 奇数节点连接 偶数节点链表的头节点,形成一个新的链表(将奇数链尾部连接到偶数链头部)odd_cur.next = tmp_head.next//4. 返回新链表的头节点(新链表的头节点为:奇数节点链表的头结点,即原链表的头节点)返回 head // 新链表头部仍为原始头节点
具体完整代码你可以参考下面视频的详细讲解。
-
Python版本:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1370401 -
Java版本:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1366845 -
Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1364602
4.小结
对链表的奇偶节点进行排序,就是要更改奇数节点与偶数节点的指针域。让奇数节点的指针域指向下下节点(奇数节点指向奇数节点),偶数节点的指针域也是指向下下节点(偶数节点指向偶数节点)。最后再将奇数节点中最后一个节点的指针域指向偶数节点中的第一节点。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

-
Python编码实现:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1509965 -
Java编码实现:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1510007 -
Golang编码实现:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1509945
对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:会当凌绝顶,一览众山小。
相关文章:
可视化图解算法:链表的奇偶重排(排序链表)
1. 题目 描述 给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。 注意是节点的编号而非节点的数值。 数据范围:节点数量满足 0≤n≤105,节点中的值都满足 0≤val≤10000 要…...
Atlas 800I A2 双机直连部署DeepSeek-R1-w8a8
一、环境信息 1.1、硬件信息 Atlas 800I A2 * 2 1.2、环境信息 操作系统:openEuler 22.03 LTS NPU驱动:Ascend-hdk-910b-npu-driver 24.1.0 linux-aarch64.run NPU固件:Ascend-hdk-910b-npu-firware 7.5.0.3.220.run MindIE镜像ÿ…...
如何确保异步任务在 HTTP 返回后继续执行?context.WithoutCancel
文章目录 如何确保异步任务在 HTTP 返回后继续执行?问题分析如何确保异步任务在 HTTP 返回后继续执行?(1)使用独立的 context(2)手动传递父 ctx 中的值(3)使用 context.WithoutCance…...
SAP Activate Methodology in a Nutshell Phases of SAP Activate Methodology
SAP Activate Methodology in a Nutshell Phases of SAP Activate Methodology...
开源AI大模型、AI智能名片与S2B2C商城小程序源码:实体店引流的破局之道
摘要:本文聚焦实体店引流困境,提出基于"开源AI大模型AI智能名片S2B2C商城小程序源码"的技术整合方案。通过深度解析各技术核心机制与协同逻辑,结合明源云地产营销、杭州美甲店裂变等实际案例,论证其对流量精准获取、客户…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
C++ :顺序容器
一、顺序容器概述 顺序容器通过元素在容器中的线性存储顺序来维护数据,允许通过位置(下标)访问元素。标准库提供6种核心顺序容器: 容器类型头文件底层结构特点vector<vector>动态数组快速随机访问,尾部高效增…...
身份证信息要素真伪认证-身份证二、三要素实名接口
在数字化时代,身份验证的准确性和安全性至关重要。身份证二、三要素实名接口作为一种高效且可靠的身份验证工具,正逐渐成为众多行业确保信息真实性、防范欺诈行为的关键手段。 身份证二、三要素实名接口主要验证身份证号码、姓名以及证件头像是否一致。通…...
pyecharts在jupyter notebook中不能够渲染图表问题。
在使用jupyter notebook中使用pyecharts绘制可视化图表的时候,发现图表不能渲染到页面中,生成的html是没问题的,本文主要解决在jupyter notebook中不能渲染这个问题。 1、原因分析 2、解决办法 如果是使用的虚拟环境,需要下你提前激活虚拟环境,再进行下列操作。 因为需要…...
【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】
文章目录 一、单例模式的特点二、饿汉模式实现单例三、懒汉模式实现单例四、STL线程安全吗?五、智能指针线程安全吗? 一、单例模式的特点 一个类,只应该实例化了一个对象,就是单例。 二、饿汉模式实现单例 举个饿汉模式的例子&…...
C++11 标准库 `find` 与 `find_if` 详解
一、std::find 函数 功能:在指定范围内查找特定值,返回第一个匹配元素的迭代器;若未找到,返回 end() 迭代器。 原型: template <class InputIt, class T> InputIt find(InputIt first, InputIt last, const T&…...
每日总结3.24
第十届蓝桥杯大赛软件赛省赛C/C 大学 B 组 183.完全二叉树的权值(找规律,临界值) #include <bits/stdc.h> using namespace std; int a[1000005]; int main() { int m;int d; cin>>m; int sum;int maxn0; for(int i1;i&…...
Redis分布式寻址算法
分布式寻址算法是分布式系统中用于确定数据应该存储在哪个节点的算法。这些算法对于实现高效的数据存取、负载均衡和系统扩展性至关重要。以下是几种常见的分布式寻址算法的解释: 1. Hash 算法 原理:通过哈希函数将数据的键(Key)…...
kotlin init执行顺序
一 代码 kotlin: package test.fclass Test1 { }class TestInit(s: String, i: Int) {var name: String? nullvar age 0private var a :Int 1init {this.name sthis.age iprintln("init代码块: $name, $age")}}转成java // Test1.java package test.f;import…...
详解Spark executor
在 Apache Spark 中,Executor(执行器) 是运行在集群工作节点(Worker Node)上的进程,负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一,直接决定了任务的并行度和资源利用…...
单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结
RAM 与 内存 RAM(Random Access Memory,随机存取存储器) 和 内存 这两个术语通常是 同义词,即 内存 常常指的就是 RAM。 1. RAM(内存) 定义:RAM 是计算机中的 主存储器,用于临时存…...
NVIDIA V100显卡支持Tensor Core技术,而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理
NVIDIA V100显卡支持Tensor Core技术,而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理。 要利用Tensor Core加速,需要满足以下一些条件: 软件支持:所使用的深度学习框架(如PyTorch、TensorFlo…...
《深度剖析:BERT与GPT——自然语言处理架构的璀璨双星》
在自然语言处理(NLP)的广袤星空中,BERT(Bidirectional Encoder Representations from Transformers)与GPT(Generative Pretrained Transformer)系列模型宛如两颗最为耀眼的星辰,引领…...
《AI大模型趣味实战 》第7集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1
AI大模型趣味实战 第7集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1 摘要 在信息爆炸的时代,如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过Python和Flask框架,结合大模型的强大…...
JS 算术运算符
JavaScript 算术运算符 一、基础运算符及行为特性 1. 四则运算 加法 + 数值相加:5 + 3 → 8字符串拼接(隐式类型转换):"5" + 3 → "53"混合类型优先级:1 + true → 2(true转1)减法 -、乘法 *、除法 / 纯数值运算:5 - "2" → 3(字符串转…...
基于Spring Boot的健身房管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
WSL Linux 子系统download
WSL各Linux 子系统下载 WSL Linux 最新下载 微软应用商店 | Microsoft StoreWSL Linux 历史版下载复制应用商店Linux地址到转换下载地址https://store.rg-adguard.net/ Version百度网盘离线下载OracleLinux提取...
Qt中通过QLabel实时显示图像
Qt中的QLabel控件用于显示文本或图像,不提供用户交互功能。以下测试代码用于从内置摄像头获取图像并实时显示: Widgets_Test.h: class Widgets_Test : public QMainWindow {Q_OBJECTpublic:Widgets_Test(QWidget *parent nullptr);~Widgets…...
Redis GEO 命令详解:轻松实现“附近的人“功能
目录 引言 Redis GEO命令概述 什么是GEO命令? 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…...
基于springboot的校园资料分享平台(048)
摘要 随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求,创建了一个计算机管理校园资料分享平台的方案…...
模板方法设计模式在事件处理中的应用
在软件设计中,设计模式提供了一种通用的解决方案来应对特定类型的问题。本文将介绍模板方法设计模式,并展示如何在事件处理场景中应用这一模式。我们将以 AbstractEventHandler 类为例,探讨其如何通过模板方法模式来实现灵活的事件处理机制。…...
CS2 demo manager 安装
CS2DM CS Demo Managerhttps://cs-demo-manager.com/PostgreSQL(CS2DM需要17以上) EDB: Open-Source, Enterprise Postgres Database Managementhttps://www.enterprisedb.com/downloads/postgres-postgresql-downloads 新CS2dm现在打开是这样的&…...
奇怪的异形选项卡样式、弧形边框选项卡
<template><div :class"$options.name"><div class"tab">默认选项卡</div><div class"tab" active>选中选项卡</div><el-divider /><el-tabs v-model"tabActiveName" tab-click"(t…...
elasticsearch 通用笔记
文章目录 一、前言二、内容说明1、目录简介2、本文例子前提内容 三、操作内容1、设置ES为服务2、查看健康度参数解析 3、索引相关查询3.1、查询指定索引内容3.1.1、匹配查询3.1.2、精确匹配(不尝试分词)3.1.3、范围查询3.1.4、id查询3.1.5、通配符及前缀…...
Java 24 学习
一、Java 24的核心新功能 1、语言特性增强 模式匹配与原始类型支持(JEP 488):允许在instanceof和switch中使用原始类型,简化模式匹配代码,尤其适用于AI推理场景912。 灵活的构造函数体(JEP 492ÿ…...
