数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点

328. 奇偶链表

题目描述

328. 奇偶链表

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

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

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

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

运行代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* oddEvenList(ListNode* head) {if (head == nullptr) {return head;}ListNode* evenHead = head->next;ListNode* odd = head;ListNode* even = evenHead;while (even != nullptr && even->next != nullptr) {odd->next = even->next;odd = odd->next;even->next = odd->next;even = even->next;}odd->next = evenHead;return head;}
};

代码思路

一、整体思路

这段代码的目的是将给定单链表按照节点索引的奇偶性进行分组重新排列。它通过遍历链表,将奇数索引的节点组成一个链表,偶数索引的节点组成另一个链表,最后将偶数链表连接到奇数链表的末尾。

二、函数分析

  1. 首先检查输入的链表头节点head是否为nullptr,如果是则直接返回head,表示空链表无需处理。
  2. 接着,定义一个指针evenHead指向链表的第二个节点,因为第二个节点的索引为偶数,这个指针将作为偶数链表的头节点。
  3. 然后定义两个指针oddeven,分别初始化为headevenHead,用于遍历奇数链表和偶数链表。
  4. 进入一个循环,循环条件是even不为nullptreven->next不为nullptr。在循环中:
    • even = even->next:将even指针移动到下一个偶数节点。
    • even->next = odd->next:将偶数节点even的下一个指针指向新的奇数节点的下一个节点,即连接下一个偶数节点。
    • odd = odd->next:将odd指针移动到下一个奇数节点。
    • odd->next = even->next:将奇数节点odd的下一个指针指向偶数节点even的下一个节点,即连接下一个奇数节点。
  5. 循环结束后,奇数链表和偶数链表都已处理完毕。
  6. 最后,将奇数链表的末尾节点odd的下一个指针指向偶数链表的头节点evenHead,完成链表的重新排列,并返回head,即重新排列后的链表的头节点。

86. 分隔链表

题目描述

86. 分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

运行代码

class Solution {
public:ListNode* partition(ListNode* head, int x) {ListNode *smallerDummy = new ListNode(0), *largerDummy = new ListNode(0);ListNode *smaller = smallerDummy, *larger = largerDummy;while (head != nullptr) {if (head->val < x) {smaller->next = head;smaller = smaller->next;} else {larger->next = head;larger = larger->next;}head = head->next;}smaller->next = largerDummy->next;larger->next = nullptr;return smallerDummy->next;}
};

代码思路

一、整体思路

这段代码的目的是将给定链表按照特定值x进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前,同时保持两个分区中每个节点的初始相对位置。

二、函数分析

  1. 首先创建两个新的链表头节点smallerDummylargerDummy,分别用于存储小于x的节点和大于或等于x的节点。同时创建两个指针smallerlarger,分别初始化为smallerDummylargerDummy,用于遍历和构建这两个新链表。
  2. 然后进入一个循环,遍历输入链表head。在循环中:
    • 无论当前节点连接到哪个链表,都要将head指针更新为head = head->next,以便继续遍历输入链表。
    • 如果当前节点的值大于或等于x,则将该节点连接到larger链表的末尾,即larger->next = head,然后更新larger指针为larger = larger->next
    • 如果当前节点的值小于x,则将该节点连接到smaller链表的末尾,即smaller->next = head,然后更新smaller指针为smaller = smaller->next
  3. 循环结束后,输入链表遍历完毕。此时,将smaller链表的末尾连接到larger链表的头部,即smaller->next = largerDummy->next。然后将larger链表的末尾设置为nullptr,以避免形成循环链表。
  4. 最后,返回smallerDummy->next,即分隔后的链表的头节点。

24. 两两交换链表中的节点

题目描述

24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

运行代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head==nullptr||head->next==nullptr){return head;}ListNode* newhead=head->next;head->next=swapPairs(newhead->next);newhead->next=head;return newhead;}
};

代码思路

这段代码的目的是实现链表中相邻节点的两两交换。它采用递归的方式,从链表的头部开始,每次交换两个相邻节点,并继续递归处理剩余的链表部分。

  1. 首先检查输入链表的头节点head是否为nullptr,或者head->next是否为nullptr。如果是,说明链表中没有节点或者只有一个节点,无需进行交换操作,直接返回head
  2. 如果链表中有两个或以上的节点,定义一个新的头节点newheadhead->next,表示交换后的链表的新头节点。
  3. 接着,将head节点的下一个节点指向递归调用swapPairs(newhead->next)的结果,即处理完后面的链表部分后返回的新链表的头节点。这样可以将当前的两个节点与后面交换后的链表连接起来。
  4. 然后,将newhead节点的下一个节点指向head,完成当前两个节点的交换。
  5. 最后,返回newhead,即交换后的链表的头节点。

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

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

相关文章

头条|司法部公法局局长访谈:推进高水平公立鉴定机构建设!加快推进司法鉴定立法!

主持人&#xff1a;大家好&#xff0c;我是司法部AI主播司政轩。为切实做好党的二十届三中全会精神学习宣传贯彻&#xff0c;积极反映司法部及地方司法行政机关学习全会精神的体会收获和贯彻落实举措&#xff0c;我们推出了“学习宣传贯彻党的二十届三中全会精神--司法行政微访…

Elasticsearch 检索优化:停用词的应用

Elasticsearch 检索优化&#xff1a;停用词的应用 场景描述 目前在 Elasticsearch 集群中存储约 1.5 亿篇文章数据&#xff0c;随着数据量的增加&#xff0c;检索性能问题逐渐显现。在列表检索和聚合操作中&#xff0c;CPU 消耗飙升至 100%&#xff0c;并且检索耗时较长&…

私域电商:自主发展新路径与创新模式融合

摘要&#xff1a;本文深入探讨了私域电商相较于传统电商在自主权方面的优势&#xff0c;并结合 AI 智能名片、链动 21 模式以及商城小程序等创新元素&#xff0c;阐述了私域电商如何为商家提供更大的发展空间和自主权&#xff0c;以及这些创新模式在私域电商中的应用价值&#…

口碑最好的头戴式耳机是哪些?高品质头戴式耳机对比测评揭晓

头戴式耳机以其出色的音质表现和舒适的佩戴体验&#xff0c;成为了音乐爱好者和日常通勤用户的热门选择。而在众多品牌和型号中&#xff0c;口碑最好的头戴式耳机是哪些&#xff1f;面对市场上丰富的选择&#xff0c;找到一款音质优良、佩戴舒适且性价比高的耳机并不容易。今天…

ESP8266+DHT11+Python制作一个物联网温湿度传感器

ESP8266是一款低功耗、高集成度的Wi-Fi SOC&#xff08;System on Chip&#xff0c;系统级芯片&#xff09;&#xff0c;这款芯片专为物联网&#xff08;IoT&#xff09;应用而设计&#xff0c;常见开发ESP8266的环境可以使用Arduino或者ESP8266 RTOS SDK、NodeMCU&#xff0c;…

【JavaScript】数据结构之链表(双指针、滑动窗口)

什么是链表&#xff1f; 多个元素存储的列表链表中的元素在内存中不是顺序存储的&#xff0c;而是通过“next”指针联系在一起的&#xff0c;这个“next”可以自定义。JS中的原型链原理就是链表结构&#xff0c;是通过__proto__指针联系在一起的。 双指针形式 对撞指针&am…

你还在为试衣间排队烦恼吗?AI魔法绘,让虚拟试衣触手可及!

我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 大家好&#xff01;今天我要跟大家聊聊一个超级有趣又实用的新…

施耐德EcoStruxure Machine SCADA Expert(EMSE)报警记录进阶(十六)

针对某些特殊行业&#xff08;诸如医药行业&#xff09;的设备生产需要符合GMP相关规定&#xff0c;这就导致需要数据溯源。 EMSE可以通过与sql的连接实现报警历史记录的永久存储。 1.EMSE打开相关配置 2.sql创建表单 用于报警历史数据的存储容器 3.EMSE内选择sql表单 4.现在…

mistune,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - mistune。 Github地址&#xff1a;https://github.com/lepture/mistune Markdown 是一种轻量级的标记语言&#xff0c;以其简洁的语法和可读性广泛应用于文档编写、博客发布和在线内容管理系统中。Python 作为一门灵活…

【ESP32】ESP-IDF开发 | UART通用异步收发传输器+串口收发例程

1. 简介 UART可以说是开发者使用得最多的外设之一了&#xff0c;打印log几乎都是使用串口来实现的。UART是一种异步全双工的通信方式&#xff0c;异步传输的特性使得它仅需2根线就可以完成全双工的传输&#xff0c;但这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相…

分布式计算技术是什么?在数据集成值得作用?

数据是现代科技技术的基础&#xff0c;面对爆炸性数据的增长&#xff0c;要求计算能力要求更高、数据整合和处理更有效&#xff0c;如何应对数据集成带来的挑战&#xff1f;本文将探讨分布式计算技术在数据集成中的优化作用。 一 分布式计算技术。 定义&#xff1a;分布式计算…

笔记:将WPF中可视化元素(Visual)保存为图像,如PNG,JPEG或BMP的方法简介

一、目的&#xff1a;将WPF中可视化元素&#xff08;Visual&#xff09;保存为图像&#xff0c;如PNG,JPEG或BMP的方法简介 BitmapEncoder 是 WPF 中用于将图像数据编码为特定格式的基类。它提供了将 BitmapSource 对象保存为各种图像格式&#xff08;如 PNG、JPEG、BMP 等&…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

C++—vector的常见接口与用法(正式进入STL)

目录 0.提醒 1.介绍 2.构造 1.正常构造 2.默认值构造 3.调用默认构造函数构造 3.遍历 1.迭代器 2.范围for 3.下标访问 4.容量 1.capacity&#xff1a;返回当前容器的容量 2.reserve&#xff1a;如果传的k比当前容量大&#xff0c;则扩容到比k大或者等于k的数&…

车载软件调试工具系列---Trace32简介UI界面简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

二叉搜索树的使用及其详细解析

1.概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结点的值 • 它…

JDK如何下载源码?

文章目录 JDK如何下载源码&#xff1f;JDK源码介绍下载JDK源码idea配置源码路径 JDK如何下载源码&#xff1f; JDK&#xff08;Java Development Kit&#xff09;是开发Java应用程序的基础工具包&#xff0c;包含了编译、运行和调试Java应用程序所需的所有工具。JDK源码主要指…

2024年中国研究生数学建模竞赛D题大数据驱动的地理综合问题

2024年中国研究生数学建模竞赛D题 大数据驱动的地理综合问题 地理系统是自然、人文多要素综合作用的复杂巨系统[1-2]&#xff0c;地理学家常用地理综合的方式对地理系统进行主导特征的表达[3]。如以三大阶梯概括中国的地形特征&#xff0c;以秦岭—淮河一线和其它地理区划的方…

2024华为杯研究生数学建模C题【数据驱动下磁性元件的磁芯损耗建模】思路详解

问题一 励磁波形分类 励磁波形作为影响磁芯性能的核心要素之一&#xff0c;其形态深刻影响着磁芯的损耗特性。励磁波形的独特形状直接塑造了磁芯内部磁通的动态行为&#xff0c;不同的波形轮廓影响了磁通密度随时间的变化速率&#xff0c;导致其损耗特性呈现出显著差异。因此&…

【操作系统】01.冯·诺伊曼体系结构

上面这张图就是我们经常能在各种教材中看到的冯诺伊曼体系结构。我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 一、认识设备 输入设备&#xff1a; 键盘、鼠标、网卡、磁盘、摄像头…… 输出设备&a…