【力扣】重排链表

news2024/10/10 10:26:47

 🔥博客主页: 我要成为C++领域大神

🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】

❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于分享知识,欢迎大家共同学习和交流。

10f3f804036d438784915f2c6f94fb5d.gif

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

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

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

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

示例 1:

7b7760124d9aef4b376b5244e5e12d44.png

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

示例 2:

a49fac08d53bfba20b79571ed1730801.png

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

方法一:折半翻转再重连

折半拆分链表+倒置链表+合并链表

链表长度为奇数和偶数时,需要拆分的节点位置不同。因此需要判断长度奇偶。
int half=nLength%2==0?nLength/2:(nLength+1)/2;

流程:

1、遍历链表,记录长度nLength
2、根据长度是奇数还是偶数,求得中间折半断开位置int half=nLength%2==0?nLength/2:(nLength+1)/2;
3、拆分链表。while循环,每次循环迭代中,都会将 half 减1,以确保循环会在遍历到链表一半的位置时结束。找到其一半位置的节点,将其后面的节点都断开,使链表分成两个部分。

int half=nLength%2==0?nLength/2:(nLength+1)/2;
    while(half>=0){
        if(half==0){
            pBreak=p;
            break;
        }
       else if(half==1){
        struct ListNode* pNext=p->next;
        p->next=NULL;
        p=pNext;
       }
       else{
        p=p->next;
       }
        half--;
    }


4、将后一半位置的链表进行倒置。
ReverseList:三个指针:断开、改向、移动

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL)
        return NULL;
    struct ListNode* p1 = NULL;
    struct ListNode* p2 = head;
    struct ListNode* p3 = p2->next;
    while (p3) {
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        p3 = p3->next;
    }
    p2->next = p1;
    return p2;
}


5、合并原来的一半链表和倒置之后的一半链表。(MergeList:三个指针)

struct ListNode* mergeList(struct ListNode* head1, struct ListNode* head2) {
    if (head1 == NULL)
        return head2;
    if (head2 == NULL)
        return head1;
    struct ListNode* head = head1;
    struct ListNode* p = head1;
    head1 = head1->next;
    while (head1 && head2) {
        p->next = head2;
        p = head2;
        head2 = head2->next;
        p->next = head1;
        p = head1;
        head1 = head1->next;
    }
    if (head1 == NULL)
        p->next = head2;
    if (head2 == NULL)
        p->next = head1;
    return head;
}

方法二:折半断开入栈

流程:

1、遍历链表,记录长度nLength
2、根据长度是奇数还是偶数,求得中间折半断开位置int half=nLength%2==0?nLength/2:(nLength+1)/2;
3、拆分链表。while循环,每次循环迭代中,都会将 half 减1,以确保循环会在遍历到链表一半的位置时结束。找到其一半位置的节点,将其后面的节点都断开,使链表分成两个部分。

int half=nLength%2==0?nLength/2:(nLength+1)/2;
    while(half>=0){
        if(half==0){
            pBreak=p;
            break;
        }
       else if(half==1){
        struct ListNode* pNext=p->next;
        p->next=NULL;
        p=pNext;
       }
       else{
        p=p->next;
       }
        half--;
    }

4、将[half,nLength]部分的链表压入栈中

stack<ListNode*> s;
while (pBreak != nullptr) {
    s.push(pBreak);
    pBreak = pBreak->next;
}

5、 依次将节点出栈,合并前后两部分节点

        ListNode* ptr1 = head;
        ListNode* ptr2 = s.top();
        s.pop();
        while (!s.empty()) {
            ListNode* tempNode = ptr1->next;
            ptr1->next = ptr2;
            ptr2->next = tempNode;
            ptr1 = tempNode;
            ptr2 = s.top();
            s.pop();
        }

6、尾节点的指针域置空

ptr2->next = nullptr; 

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

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

相关文章

传媒行业采购堡垒机的必要性你知道吗?

随着互联网的快速发展&#xff0c;传媒行业也是发展速度。特别是近年来&#xff0c;自媒体行业的火热&#xff0c;如何保障网络安全&#xff0c;如何保障大家信息安全至关重要。虽然国家严格要求执行等保政策&#xff0c;但大家对于为什么传媒行业要采购堡垒机不是很了解。你知…

JDK16特性

JDK16特性 一、JAVA16概述 2021年3月16日正式发布,一共更新了17JEP https://openjdk.java.net/projects/jdk/16/ 二、语法层面变化 1.JEP 397:密封类(第二次预览) sealed class 第二次预览通过密封的类和接口来增强Java编程语言,这是新的预览特性,用于限制超类的使用密封…

Nuxt 3组件开发与管理

title: Nuxt 3组件开发与管理 date: 2024/6/20 updated: 2024/6/20 author: cmdragon excerpt: 摘要&#xff1a;本文深入探讨了Nuxt 3的组件开发与管理&#xff0c;从基础概念、安装配置、目录结构、组件分类与开发实践、生命周期与优化&#xff0c;到测试与维护策略。详细…

小程序注册

【 一 】小程序注册 微信公众平台 https://mp.weixin.qq.com/ https://mp.weixin.qq.com/注册 邮箱激活 小程序账户注册 微信小程序配置 微信小程序开发流程 添加项目成员 【 二 】云服务 lass 基础设施服务&#xff08;组装机&#xff09; 你买了一大堆的电脑配件&#x…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容&#xff1a; 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件&#xff0c;在大多数情况下被用于构建硬件。由于该操作特别复杂&#xff0c;因此通常由软件提…

鸿蒙开发报错 -cppcrash happened

报错信息&#xff1a; cppcrash happened in ‘设备名’ 现象&#xff1a;打开应用就闪退&#xff0c;无论是模拟器还是真机都会闪退&#xff0c;预览器没有问题 报错原因&#xff0c;在入口页面添加了export&#xff0c; 页面是不需要导出的&#xff0c;只有组件需要导出&…

三,SSM整合-前后端分离(实现增删改查)

实现增删改查 实现功能03-添加家居信息需求分析/图解思路分析代码实现注意事项和细节 实现功能04-显示家居信息需求分析/图解思路分析代码实现 实现功能05-修改家居信息需求分析/图解思路分析代码实现注意事项和细节 实现功能06-删除家居信息需求分析/图解思路分析代码实现课后…

数据接入开放协议-术语表

数据与元数据 - 数据 传感器采样生成的 具有物理含义的一个或一系列值 - 实时数据 包含 时间、数据质量指示的一个或一系列数据 - 位号元数据 对于传感器采样得到的数据的物理描述 包括但不限于 时间、单位、数据范围、数据质量指示 上位机与下位机 - 上位机supOS 系统 - 下位…

信息学奥赛初赛天天练-32-CSP-J2021阅读程序-冒泡排序、数组去重、二分查找、坐标确定矩形应用

PDF文档公众号回复关键字:20240625 2021 CSP-J 完善程序3 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) (矩形计数)平面上有n个关键点&#xff0c;求有多少个四条边都和x轴或者y轴平行的矩形&#xff0c;满足四个顶点都是关键点。给出的关键点可能有重复&am…

ComfyUI 插件竟然包含病毒!做好这 5 点降低中招风险!

前言 大家好&#xff0c;这里是和你们一起探索 AI 的AI绘画月月~ ComfyUI 是目前最受欢迎的开源 AI 绘画绘画工具之一&#xff0c;它具有极高的灵活性&#xff0c;只需安装对应的插件就可以自己搭建工作流&#xff0c;实现个性化出图或体验最新的 AI 模型。如果你是 ComfyUI 的…

LP-SCADA数据采集监控平台是什么?

SCADA系统&#xff0c;即数据采集与监视控制系统&#xff0c;是一种以计算机软件为基础&#xff0c;利用计算机技术、自动控制技术、通信与网络技术、传感仪表及执行机构实现对广域分布生产过程设备设施的远程数据采集、控制、监测、参数调节以及各类信号报警的生产过程控制与调…

vue大屏适配方案

前言 开发过大屏的铁汁们应该知道&#xff0c;前期最头疼的就是大屏适配&#xff0c;由于大屏项目需要在市面上不是很常见的显示器上进行展示&#xff0c;所以要根据不同的尺寸进行适配&#xff0c;今天我将为大家分享的我使用的大屏适配方案&#xff0c;话不多说&#xff0c;直…

Unity 弧形图片位置和背景裁剪

目录 关键说明 Unity 设置如下 代码如下 生成和部分数值生成 角度转向量 计算背景范围 关键说明 效果图如下 来自红警ol游戏内的截图 思路&#xff1a;确定中心点为圆的中心点 然后 计算每个的弧度和距离 Unity 设置如下 没什么可以说的主要是背景图设置 代码如下 …

天才程序员周弈帆 | Stable Diffusion 解读(四):Diffusers实现源码解读

本文来源公众号“天才程序员周弈帆”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Stable Diffusion 解读&#xff08;四&#xff09;&#xff1a;Diffusers实现源码解读 接上一篇文章[天才程序员周弈帆 | Stable Diffusion 解读…

关于哈希表的一点理论基础

1.哈希表 数组就是哈希表&#xff0c;关键元素就是数组的下标。主要用于判断一个元素是否在集合中出现。 2.哈希函数 3.哈希碰撞 即有两个元素的下标相同 3.哈希碰撞的解决办法 &#xff08;1&#xff09;拉链法&#xff1a; 放到链表中&#xff0c;但要注意控制哈希表的大…

【SpringSecurity】认证与鉴权框架SpringSecurity——授权

目录 权限系统的必要性常见的权限管理框架SpringSecurity授权基本流程准备脚本限制访问资源所需权限菜单实体类和Mapper封装权限信息封装认证/鉴权失败处理认证失败封装鉴权失败封装配置SpringSecurity 过滤器跨域处理接口添加鉴权hasAuthority/hasAnyAuthorityhasRole/​ hasA…

L58---100.路径总和(广搜)---Java版

1.题目描述 2.思路 (1)首先检查p,q节点是不是为空&#xff1b;如果同时为空&#xff0c;则他们是相同的树 (2)p&#xff0c;q节点如果一个为空&#xff0c;一个不为空&#xff0c;则他们不是相同的树 (3)p,q的值不一样&#xff0c;则他们不是相同的树 (4)递归遍历左子树和右子…

用英文介绍纽约:NEW YORK, USA‘s MEGACITY

NEW YORK, USA’s MEGACITY | America’s Largest City Link: https://www.youtube.com/watch?vdzjQ-akB3BI&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index24 The story of New York City, America’s megalopolis. Summary Paragraph 1: The Historical Developm…

路由表操作

路由表&#xff08;Routing Table&#xff09;是网络设备&#xff08;如计算机、路由器、交换机等&#xff09;用来确定数据包传输路径的数据库。每当网络设备收到一个数据包时&#xff0c;它会查找路由表&#xff0c;决定将数据包转发到哪个网络接口或网关。下面介绍路由表的基…

vue3 antv/g6 动态设置mode,让节点不可以拖动

1、查看一下官网的设置说明 G6 设置mode 默认模式&#xff1a; const graph new G6.Graph({container: div,width: 500,height: 500,modes: {default: [drag-node,drag-canvas],custom: [drag-canvas]} })默认情况下&#xff0c;我们定义的是default&#xff0c;然后创建节…