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

news2024/11/16 8:22:35

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.coloradmin.cn/o/2154394.html

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

相关文章

华为全联接大会HC2024 观会感

9/19-21于上海&#xff0c;华为举办了他一年一届也是最重要的华为系展会-Huawei Connect 华为全联接大会&#xff0c;今天有幸赶在展会最后一天来参观一下 上午照常是keynote&#xff0c;由华为计算线总裁进行了今天的KN开场&#xff0c;介绍了华为在“算”方面的进展&#x…

Java | Leetcode Java题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution {public int strongPasswordChecker(String password) {int n password.length();int hasLower 0, hasUpper 0, hasDigit 0;for (int i 0; i < n; i) {char ch password.charAt(i);if (Character.isLowerCase(ch))…

企业内训|LLM大模型实战技术深度研修-某智算厂商研发中心

课程概要 本课程深入研修LLM大模型在实际应用中的技术实现和优化策略。通过迁移与适配、训练与调优、推理优化以及综合应用与案例分析四个模块&#xff0c;系统地探讨大模型的核心理论、关键技术和实践操作。课程内容涵盖模型迁移的理论与实操、预训练与微调策略、推理性能优化…

[数据结构与算法·C++版] 笔记 1.2 什么是数据结构

1.2 什么是数据结构 结构&#xff1a;实体 关系数据结构&#xff1a; 按照逻辑关系组织起来的一批数据&#xff0c;按一定的存储方法把它存储在计算机中在这些数据上定义了一个运算的集合 数据结构的逻辑组织 线性结构 线性表&#xff08;表&#xff0c;栈&#xff0c;队列&…

新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)

这是在复现论文“Towards accurate subgraph similarity computation via neural graph pruning”时遇到的报错。 ImportError: cannot import name uniform from torch_geometric.nn.pool.topk_pool 一、报错原因 论文作者使用的是2.1.0版本的torch_geometric。而我安装了2.…

Google 扩展 Chrome 安全和隐私功能

过去一周&#xff0c;谷歌一直在推出新特性和功能&#xff0c;旨在让用户在 Chrome 上的桌面体验更加安全&#xff0c;最新的举措是扩展在多个设备上保存密钥的功能。 到目前为止&#xff0c;Chrome 网络用户只能将密钥保存到 Android 上的 Google 密码管理器&#xff0c;然后…

springboot实战学习(6)(用户模块的登录认证)(初识令牌)(JWT)

接着上篇博客学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑。具体往回看了解的链接如下。 springboot实战学习笔记&#xff08;5&#xff09;(用户登录接口的主逻辑)-CSDN博客文章浏览…

爬虫学习 | 03 爬虫静态网页的爬取(1)

学习的资料是&#xff1a;python chatgpt 网络爬虫从入门到精通 目录 Step1&#xff1a;基本的环境 Step2&#xff1a;ai辅助解决问题实现代码功能&#xff1a; Step3&#xff1a;网页的初步分析&#xff1a; Step4&#xff1a;静态网页的爬取 爬取信息&#xff1a; 实操…

MQ入门(4)

Erlang&#xff1a;面向高并发的 单机的吞吐量就是并发性&#xff1a;Rabbitmq是10w左右&#xff08;现实项目中已经足够用了&#xff09;&#xff0c;RocketMQ是10w到20w&#xff0c;Kafka是100w左右。 公司里的并发&#xff08;QPS&#xff09; 大部分的公司每天的QPS大概…

【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…

AWS 管理控制台

目录 控制台主页 AWS 账户信息 AWS 区域 AWS 服务选择器 AWS 搜索 AWS CloudShell AWS 控制面板小部件 控制台主页 注册新的 AWS 账户并登录后&#xff0c;您将看到控制台控制面板。这是与各种 AWS 服务以及其他重要控制台组件进行交互的起点。控制面板由页面顶部的导航…

初始Vitis——ZYNQ学习笔记1

一、Vitis是什么 Vitis 统一软件平台的前身为 Xilinx SDK&#xff0c;从 Vivado 2019.2 版本开始&#xff0c; Xilinx SDK 开发环境已统一整合到全功能一体化的 Vitis 中。 Vitis 开发平台除了启动方式、软件界面、使用方法与 SDK 开发平台略有区别&#xff0c;其他操作几乎一模…

Windows本地连接远程服务器并创建新用户详细记录

前提可知&#xff1a; &#xff08;1&#xff09;服务器IP地址&#xff1a;x.x.x.x &#xff08;2&#xff09;服务器名称&#xff1a;root&#xff08;一般默认为root&#xff0c;当然也有别的名称&#xff09; &#xff08;3&#xff09;服务器登陆密码&#xff1a;**** 一、…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Python类及元类的创建流程

Python类及元类的创建流程 代码运行结果再看type和object的关系和约定type和object具有的方法不一样看代码和运行结果&#xff0c;可以完全理解python的执行过程。再补充几点&#xff0c; 代码 class MetaCls(type):print(0>>>, MetaCls, 0)def __init__(self, name,…

13.面试算法-字符串常见算法题(二)

1. 字符串反转专题 我们知道反转是链表的一个重要考点&#xff0c;反转同样是字符串的重要问题。常见问题也就是在LeetCode中列举的相关题目&#xff1a; 【1】LeetCode344. 反转字符串&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符…

【小沐学GIS】blender导入OpenStreetMap城市建筑(blender-osm、blosm)

文章目录 1、简介1.1 blender1.2 osm地图 2、OpenStreetMap下载方式2.1 Simple2.2 Overpass API2.3 OSM星球2.4 Geofabrik下载2.5 其他方法2.6 BBBike 3、blender-osm插件3.1 简介3.2 操作 结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费的开源 3D …

机器学习周报第五十七周 GATRes

文章目录 week56 HA-GNN摘要Abstract一、大数据相关1. 单机zookeeper2. 与hbase对接的技术2.1 使用hive操作hbase——直接与hbase对接&#xff08;非接口技术&#xff09;使用 pyhive 操作 Hive 2.2 mysql操作hbase&#xff08;非接口技术&#xff09;导出 HBase 数据到 MySQL导…

【技术调研】三维(7)-Unity基础笔记

安装 ​ 最好使用长期维护版本。 创建项目 ​ 略 窗口布局 Hierarchy:层级面板,展示当前打开的场景里面有哪些物体。 Scene:场景面板,显示当前场景的样子 Game:游戏面板,场景运行的时候的样子 Inspector:检视面板(或属性面板),查看一个游戏物体由哪些组件组成。 …