LeetCode 刷题系列 -- 143. 重排链表

news2024/9/20 12:40:45

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

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

输出:[1,4,2,3]

示例 2:

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

输出:[1,5,2,4,3]

思路:

定义一个 list,将链表依次按照顺序存入到 list 中。定义list的最左边的下标 left = 0,最右边的下标 right = list.size - 1 ,将 left 与right的链表节点重新排序,
list[ left ] ->next = list[ right ]
定义 curr 节点,指向每次重排两个节点后的最右节点,即 curr = list [ right ] 。
注意:为了防止出现循环链表,需要将排序后的链表的最后一个节点的 next 指向 空指针
left 与 right 最终有两种情况:
1. left 与 right 相等, 说明:链表为奇数个节点, 注意:奇数个节点时,需要手动将中间的节点加入到重排序的链表中,再将最后一个节点的 next指向 空指针
2. left > right 时,说明:链表为偶数个节点,此时直接将最后一个节点指向 空指针 list[ left ]-> next = nullptr 即可

c++:

/**
 * 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:
    void reorderList(ListNode* head) {
        vector<ListNode*> node_vec;

        int node_count = 0;
        ListNode* curr = head;

        while(curr != nullptr) {
            node_count++;
            node_vec.emplace_back(curr);
            curr = curr->next;
        }

        ListNode* preHead = new ListNode;
        curr = preHead;

        int left = 0;
        int right = node_count - 1;

        while(left<right) {
            curr->next = node_vec[left];
            node_vec[left]->next = node_vec[right];
            curr = node_vec[right];
            left++;
            right--;
        }
      
        if(left == right) {
          // 说明是奇数个节点,最后一个节点next指向 空指针, 注意:奇数个节点时,需要手动将中间的节点加入到重排序的链表中
          curr->next = node_vec[left];
          node_vec[left]->next = nullptr;
        } else {
          // 说明是偶数个节点,最后一个节点是当前  left 下标对应的节点
          node_vec[left]->next = nullptr;
        }

    }
};

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

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

相关文章

深度卷积神经网络、池化层、为什么使用卷积、残差网络

目录1.深度卷积神经网络(a deep convolutional neural network)输入图像的维度是&#xff0c;如果&#xff0c;计算输出图像维度公式&#xff1a;。s表示步幅&#xff0c;p表示填充的层数。filters的通道数是和输入图像的通道数保持一致的。分析上图案例&#xff1a;第一层卷积…

leetcode刷题记录总结-5.双指针专题

文章目录一、过滤保序27.移除元素题解题解1&#xff1a;暴力解法题解2&#xff1a;双指针法[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)题解[283. 移动零 ](https://leetcode.cn/problems/move-zeroes/description/)题解…

借助ChatGPT学习ROS2机器人编程

很好用&#xff0c;很方便。简单发布和订阅代码直接能跑的。如下&#xff1a;学习效率指数提升&#xff0c;果然数字生产力之神&#xff01;空洞的问题和回复&#xff1a;如何在一个月时间内掌握ROS2机器人操作系统的全部核心内容&#xff1f;要在一个月时间内掌握ROS2机器人操…

源码启动MeterSphereV2.6版本注意事项(三)

前言 之前写过一篇MeterSphereV2.3版本Mac本地启动详细教程&#xff08;含常见错误&#xff09;本地启动V2.3版本的。时隔3个月&#xff0c;MeterSphere已经到了V2.6 版本了&#xff0c;很多小伙伴私信我让我写一篇V2.6 版本的启动&#xff0c;刚好趁过年有时间&#xff0c;给…

Spring和SpringMvc详细讲解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Spring和SpringMvc详细讲解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: …

金仓数据库单表与多表查询

单表与多表查询 单引号与双引号 针对有空格、特殊字符、数字开头的字段别名必须加双引号 针对标量字符串表达式必须用加单引号 连接运算 字符串的拼接运算 字符串拼接经常用于生成SQL脚本 删除exam模式下所有的表&#xff0c;可以通过拼接生成如下批量的SQL select drop t…

scipy learn sharpen filter

文章目录1. 问题2. 方案2.1 学习一个 5 * 5的滤波核2.2 学习分通道的滤波核 以及 分离卷积3. 分析根据图像对学习滤波核之前研究过根据图像对生成3Dlut, 以及生成颜色变换系数 这里我们利用图像对学习 滤波 1. 问题 遇到的问题是这样的&#xff0c;已知一个图像和经过邻域滤…

爱快软路由对笔记本实现网络唤醒

本人有一台爱快软路由作为动态域名和端口映射&#xff0c;实现通过阿里域名远程访问内网设备。一台X201笔记本连接在软路由上。由于X201电池已经卸下无法实现来电开机&#xff0c;只能通过爱快e云APP手动实现网络唤醒&#xff0c;感觉非常麻烦。爱快云web端也不能实现开机唤醒X…

学长教你学C-day11-C语言结构体、枚举、联合体

“前面我们学习了数组&#xff0c;从数据类型来看&#xff0c;数组就是具有相同数据类型的变量集合&#xff1b;从内存空间来看&#xff0c;数组就是一串由相同大小的数据空间组成的较大的内存空间。那么结构体是什么呢&#xff1f;从内存角度讲&#xff0c;结构体也是一块地址…

PEG化芘衍生物——Pyrene-PEG-Acid,Pyrene-PEG-COOH,芘丁酸-聚乙二醇-羧基

一&#xff1a;产品描述 1、名称 英文&#xff1a;Pyrene-PEG-COOH&#xff0c;Pyrene-PEG-Acid 中文&#xff1a;芘丁酸-聚乙二醇-羧基 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a; Carboxylic acid PEG Pyrene PEG 4、分子量&#xff1a;可定制2000、1000、340…

2022个人年度总结:别让内心的烦躁和焦虑,占据本就不多的热情。

在从毕业一直到现在&#xff0c;我都会写一篇关于自己的从技术、商业、人情世故以及未来展望的博文&#xff0c;以至于归纳每个时期的自己&#xff0c; 走在互联网开发的边缘&#xff0c;不得不抽出时间鞭策自己学习新知识&#xff0c;未知的知识是 充满好奇的&#xff0c; 就好…

Makefile学习⑧:Makefile中通用部分做公共头文件

Makefile学习⑧&#xff1a;Makefile中通用部分做公共头文件 创建2个文件夹Demo1和Demo2,2个文件夹中的文件完全一样&#xff0c;但是命名不一样。 博主创建的如下&#xff0c;内容沿用前几章的函数文件。 这两个Makefile中的内容除了目标文件名和依赖文件名不一致&#xff0…

轻松实现一个Python+Selenium的自动化测试框架

首先你得知道什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff…

知识抽取-实体及关系抽取

信息抽取的三个最重要&#xff0c;最受关注的子任务&#xff1a; 实体抽取 命名实体识别&#xff0c;包括实体检测&#xff08;find)和分类&#xff08;classify) 关系抽取。 通常我们所述的三元组抽取&#xff0c; 一个谓词&#xff08;predicate)带2个形参&#xff08;argum…

MySQL学习记录(9)存储引擎

文章目录6、InnoDB存储引擎6.1、逻辑存储结构6.2、架构6.2.1、概述6.2.2、内存结构6.2.3、磁盘结构6.2.4、后台线程6.3、事务原理6.3.1、事务基础6.3.2、redo log日志6.3.3、undo log日志6.4、MVCC6.4.1、基本概念6.4.2、记录中隐藏字段6.4.3、undo log日志6.4.4、readview6.4.…

算法基础(二):数组知识点及题型讲解

算法基础&#xff08;二&#xff09;&#xff1a;数组知识点及题型讲解1 数组定义2 Python数组常用操作2.1 创建数组2.2 添加元素2.3 访问元素2.4 更新元素2.5 删除元素2.6 获取数组长度2.7 遍历数组2.8 查找某个元素2.9 数组排序3 力扣题目训练一些算法基础知识点和leetcode题…

汇编语言1基础知识

机器语言 机器语言是机器指令的集合&#xff0c;即计算机可以执行的指令。 机器指令由一连串二进制数字构成&#xff0c;计算机中用高低电平表示。高电平为1&#xff0c;低电平为0。 早期通过在纸带上打孔输入计算机运算。打孔为1&#xff0c;不打孔为0。 上图出自剧版三体第…

c语言tips-【gcc详细介绍】

0. 什么是gcc GCC 原名为 GNU C语言编译器&#xff08;GNU C Compiler&#xff09;GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由 GNU 开发的编程语言译器。 GNU编译器套件包括C、C、 Objective-C、 Java、 Ada 和 Go语言前端&#xff0c…

【GPLT 二阶题目集】L2-009 抢红包

没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录&#xff0c;请你统计一下他们抢红包的收获。 输入格式&#xff1a; 输出格式&#xff1a; 按照收入金额从高到低的递减顺序输出每个人的编号和收入金额&#xff08;以元为单位&#xff0c;输出小数点后2位&a…

ISIS与OSPF的双点双向简介与配置,双点双向中存在的问题(次优路径与环路风险)

2.4.0 ISIS与OSPF的双点双向简介与配置&#xff0c;双点双向中存在的问题 关于双点双向的相关概念 单点双向 网络中连接外网的设备称为出口网关设备 &#xff0c;通常小型网络中仅有一台出口网关设备。 网络中仅存在一台出口设备与外网设备对接时相互引入对端的路由&#xf…