【力扣】重排链表

 🔥博客主页: 我要成为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.mfbz.cn/a/742460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型训练数据

自《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》发布以来&#xff0c;我国数据要素建设不断深入&#xff0c;在国家数据局等 17 部门联合印发的《“数据要素 ” 三年行动计划&#xff08;2024 - 2026 年&#xff09;》进一步明确 “建设高质量语料库和基础…

邮件推送服务的高级功能有哪些?怎么使用?

邮件推送服务的效果如何评估&#xff1f;怎么选择邮件营销服务&#xff1f; 邮件推送服务不断发展&#xff0c;提供了丰富的高级功能&#xff0c;帮助企业提升营销效果&#xff0c;优化客户体验。AokSend将探讨一些邮件推送服务的高级功能&#xff0c;并说明它们如何为企业带来…

HTTP、MQTT、CoAP大比拼:谁才是物联网通信的王者?

物联网&#xff08;IoT&#xff09;时代&#xff0c;数以亿计的设备需要相互连接和通信&#xff0c;而超文本传输协议&#xff08;HTTP&#xff09;作为互联网的基石&#xff0c;凭借其简单易用、广泛应用等优势&#xff0c;也成为了物联网通信协议的有力竞争者。本文将深入浅出…

Windows重新安装安全中心解决白屏问题

重新安装Windows安全中心&#xff08;Windows Security Center&#xff09;涉及多个步骤&#xff0c;包括重置Windows安全功能和重新安装Windows安全应用。以下是详细的步骤&#xff1a; 1. 通过PowerShell重置Windows安全中心 打开PowerShell: 在开始菜单中搜索“PowerShell”…

ClickHouse vs. Elasticsearch:十亿行数据的较量

本文字数&#xff1a;15291&#xff1b;估计阅读时间&#xff1a;39 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 Meetup活动 ClickHouse 上海首届 Meetup 讲师招募中&#xff0c;欢迎讲师在文末扫码报名&#xff01; 引言 这…

mysql 主从延迟

mysql 主从延迟 下面这句话&#xff0c;不知道对不对 注意&#xff1a;开启并行复制后&#xff0c;如果想要Xtrabackup进行全量备份的话&#xff0c;那就必须还要开启gtid复制而不是传统的位点复制 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从…

怎么加密文件夹?文件夹加密软件推荐

文件夹加密是保护电脑数据的重要方法&#xff0c;那么你知道怎么加密文件夹吗&#xff1f;下面小编就为大家推荐两款文件夹加密软件&#xff0c;帮助你安全保护重要文件夹。 文件夹加密超级大师 在加密电脑文件夹时&#xff0c;文件夹加密超级大师是你必须要了解的文件夹加密软…

基于Java仓储出入库管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中&#xff0c;由于单机的并发能力有限&#xff0c;所以常常无法满足压力测试的需求。因此&#xff0c;Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

【linux学习十七】文件服务管理

一、FTP FTP server:FTP(File Transfer Protocol,文件传输协议 )是 TCP/IP 协议组中的协议之一 软件包&#xff1a;vsftpd/安装 yum -y install vsftpd//准备文件 touch /var/ftp/abc.txt //注释:FTP服务器的主目录:“/var/ftp/”&#xff0c;是FTP程序分享内容的本机目录…

Docker 安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

stm32学习笔记---TIM输出比较(代码部分)定时器定时中断/定时器外部时钟

目录 第一个代码&#xff1a;定时器定时中断 Timer.c 初始化函数 初始化定时器的步骤 定时器的库函数 TIM_DeInit TIM_TimeBaseInit TIM_TimeBaseStructInit TIM_Cmd TIM_ITConfig TIM_InternalClockConfig TIM_ITRxExternalClockConfig TIM_InputTriggerSource …

一文读懂客户管理系统平台:概念、功能与应用场景介绍!

在当今竞争激烈的市场环境下&#xff0c;企业想要保持竞争力&#xff0c;不仅要有优质的产品和服务&#xff0c;更要有高效的客户管理手段。客户管理系统平台作为一种重要的工具&#xff0c;正在被越来越多的企业所青睐。那么&#xff0c;客户管理系统平台有什么用呢&#xff1…

fidder自动测试cookie脚本

前言 工作在使用fidder抓包时&#xff0c;经常需要找到一个请求携带的cookie中&#xff0c;真正校验了那些cookie&#xff0c;从而在代码中实现写入这些cookie的请求。这个过程除了根据经验快速过滤&#xff0c;就只能一个一个删除测试了。 所以我写了这个脚本&#xff0c;自动…

Telnet远程登录(Cisco)

Telnet 基于TCP/IP协议族 远程终端协议 在Internet上远程登录 VTY(Virtual Teletype) 通过IP连接物理上的终端 实现在Internet上 登陆和配置远程目标终端 A Router>enable Router#config Router(config)#hostname A A(config)#interface gigabitEthernet 0/0 A(confi…

ArkUI开发学习随机——得物卡片,京东登录界面

案例一&#xff1a;得物卡片 代码&#xff1a; Column(){Column(){Image($r("app.media.mihoyo")).width(200).height(200)Row(){Text("今晚玩这个 | 每日游戏打卡").fontWeight(700).fontSize(16).padding(4)}.width(200)Text("No.12").fontWe…

服务器数据恢复—raid故障导致部分分区无法识别/不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌DL380服务器中3块SAS硬盘组建了一组raid。 服务器故障&#xff1a; RAID中多块磁盘出现故障离线导致RAID瘫痪&#xff0c;其中一块硬盘状态指示灯显示红色。服务器上运行的数据库在D分区&#xff0c;备份文件存放在E分区。由于RAID瘫…

游戏AI的创造思路-技术基础-深度学习(2)

感觉坑越挖越大&#xff0c;慢慢填~~~~ 继续上篇进行填坑&#xff0c;这一篇我们介绍下循环神经网络 目录 3.2. 循环神经网络&#xff08;RNN&#xff09; 3.2.1. 算法形成过程 3.2.2. 运行原理 3.2.3. RNN有哪些优缺点 3.2.4. RNN参数 3.2.5. 如何选择RNN模型参数 3.2…

【Playwright+Python】—— 环境搭建及脚本录制!

前言 看到这个文章&#xff0c;有的同学会说&#xff1a; 静姐&#xff0c;你为啥不早早就写完python系列的文章。 因为有徒弟需要吧&#xff0c;如果你也想学自学&#xff0c;那这篇文章&#xff0c;可以说是我们结缘一起学习的开始吧&#xff01; 如果对你有用&#xff0…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…