剑指 Offer II 026. 重排链表

news2024/10/5 21:18:37

请添加图片描述

思路:
(1)找到链表中心点,如果链表节点为奇数,那么要保证前面要比后面多一个节点。
(2)将后一部分的结点进行反转。
(3)将反转后的结点插入前一部分的结点。

(1)找链表中心
    找链表中心,主要使用快慢指针,当快指针以两倍速度出发,指针指向末尾的时候,慢指针正好指向中心。难点主要是考虑停止条件。因为快指针有可能最后一次不能移动2步,所以移动一步后就要判断是否为空,不为空继续移动,移动后也有可能为空或者不为空这两种情况,所以循环的条件就是快指针为空,或者让快指针下一步为空,这样就能保证循环条件符合要求了。最后返回慢指针。

ListNode* findmid(ListNode* head)
{
    ListNode* fast = head;
    ListNode* slow = head;
    while (fast->next != nullptr&&fast!=nullptr)
    {
        slow = slow->next;
        fast = fast->next;
        if (fast->next != nullptr)
        fast = fast->next;
    }
    return slow;
}

(2)反转链表
这里使用递归的方式,直接反转。

ListNode* reverseList(ListNode* head) {
    if (!head || !head->next) {
        return head;
    }
    ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

(3)插入链表

    插入链表是最复杂的一步,因为当你修改一个结点的next的时候,会覆盖掉后面的所有元素,所以最重要的就是提前保存后面的元素,并在移动中循环起来这一过程。这里新增两个指针,一个为temp它的作用是保存主链中的下一个元素,一个为pre的它作用是保存副链中的下一个元素。总的来说主链必须指向副链(head->next = newHead),这个时候就必须要有一个变量,保存主链后一个结点(ListNode* temp = head->next),每次结束后要将主链指向后一个(head = temp)。同理每一次主链作用一次后,副链也要指向主链一次(pre->next = head),副链也要做移动(pre = newHead,newHead = newHead->next)。

   ListNode* cut(ListNode* head, ListNode* newHead)
    {
        ListNode* pre = new ListNode(0);
        pre->next = head;
        while (head != nullptr && newHead != nullptr)
        {
            ListNode* temp = head->next;
            pre->next = head;
            head->next = newHead;
            pre = newHead;
            
            head = temp;
            newHead = newHead->next;
        }
        if (head != nullptr)
        {
            pre->next = head;
        }
        return head;
    }

(4)总的主函数
中间有一个断链的操作。

void reorderList(ListNode* head) {
    ListNode* mid = findmid(head);
    ListNode* next = mid->next;
    mid->next = nullptr;
    ListNode* newHead = reverseList(next);
    ListNode* newnewHead = cut(head, newHead);
}

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

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

相关文章

前有谷歌的“生存指南”,后有金山系的“表格编程”,均登热榜

谷歌的“生存指南” 一位曾经在谷歌工作的工程师,干了一件了不起的事,花费了两年的时间,整理了一份“xg2xg”的清单。 原来这位离职的谷歌工程师为程序员编写了一份“厂外生存指南”,即使你从谷歌离职后,在这套“生存…

无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...

职场套路多,一不小心就会掉坑,一位网友讲述了自己的遭遇: 今天被领导催促离职了,当时就是这个领导把他从别的公司挖过来。这家公司催得太急,为了投奔这里,他和上家的HR都闹翻了,上家总监挽留他&…

ChatGLM ptuning 的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【中间件】kafka

目录 一、概述二、生产者1. 发送原理2. 生产者分区 Partition分区好处分区策略 3. 生产者如何提高吞吐量4. 数据可靠性ACK应答级别数据不丢失:ACK ISR数据不重复:幂等性数据有序 三、broker1. 工作流程2. 副本相关3. 底层存储4. 高效读写数据 四、消费者…

常见误区,你可曾踩过?深度剖析WEB自动化测试实施问题与解决方案

目录 摘要: 一、WEB自动化测试实施的步骤 1.测试计划 2.测试用例设计 3.环境搭建 4.脚本编写 5.执行测试 6.缺陷管理 二、WEB自动化测试常见误区 1.选择不合适的自动化测试工具和框架 2.忽略测试环境的影响 3.. 缺乏对页面元素的理解 三、示例代码 结论…

学顶教育:一级消防师资格证发放问题分享

1、为什么证书不申请没加注就可以下载? 2021年12月17日前由相关行业协会、学会或有关部门指定的机构出具的电子证书,目前无需申请加注,可直接查看、下载。 2、如何查询“证书查询验证范围”? 进入中国人事考试网首页&#xff0…

体验 Google Bard

环境 windows 10 64bitGoogle Bardpython 3.8 简介 本篇介绍一个开源的 Google 聊天机器人Bard 的 API 逆向工程,使用它,可以免费的使用 Bard 服务,项目地址:https://github.com/acheong08/Bard 安装及使用 通过 pip 来安装 pip &…

内网渗透的一些tips

声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。 每周不定时持续分享各种干货。 众亦信安,中意你啊! 一.密码抓取 平…

CVPR 2023 | 一键去除视频闪烁,该研究提出了一个通用框架

该论文成功提出了第一个无需额外指导或了解闪烁的通用去闪烁方法,可以消除各种闪烁伪影。 高质量的视频通常在时间上具有一致性,但由于各种原因,许多视频会出现闪烁。例如,由于一些老相机硬件质量较差,不能将每帧的曝光…

字符函数和字符串函数(二)

目录 1.strncpy 2.strncat 3.strncmp 4.strstr 5.strchr 6.strtok 7.strerror 1.strncpy ok,在上一篇博客的讲解中,我们谈到了strcpy这个函数,并且了解到了这个函数的功能是将源字符串的内容复制到目标字符串里,并且我们还知道了在C语…

字符函数和字符串函数(三)

1.字符分类函数 在我们的日常代码生活中,经常会遇到一类问题,比如说判断一个字母的大小写,或者标点符号等。因此,我们需要用到一些字符分类函数 函数 如果他的参数符合下列条件就返回真 iscntrl 任何控制字符 isspace 空白字符&…

使用GPT4做Leetcode第 102 场双周赛

虽然一次周赛的几个题目说明不了太多问题,比如这个周赛的Hard题目就是板子题,算不上Hard,也许把第三题和第四题的顺序换一下比较合适。但是,GPT4的表现已经严重超出了我的预期。对于这次周赛的四个题目,GPT4的表现如下…

说走就走的接口自动化测试脚本:快速提高测试效率的秘密武器

目录 摘要: 环境准备 编写测试用例 运行测试脚本 总结 摘要: 作为一名测试工程师,我们常常需要进行接口测试,目的是验证接口是否符合规范并且稳定可靠。然而,手动测试难免会出现疏漏和人为错误,因此…

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示

K_A35_003 基于STM32等单片机采集矩阵按键模块值 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数引脚说明 三、驱动说明模块工作原理:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RC矩阵按键模块1.2、STM32F103C8T6矩阵按键模块 五、基础知识学习与相…

把一个长方形平均分为4份,我想了几十种方法,不服来挑战

这是学习笔记的第 2455篇文章 这个事情的源头是在前几天哄孩子睡觉前,我和她聊分数的事情,一般为了便于理解我会拿披萨来举例,比如把一个披萨分成2份,分成3份,分成4份等,似乎顺着圆心我们可以想到既定的方案…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

50+常用工具函数之xijs更新日志(v1.2.4)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下v1.2.4 版本的更新内容以及后续的更新方向. 1. dom分类添加xss函数 该模块主要由 Kevin 贡献, 具体介绍如下: 使用方式: import { …

游戏有延迟?如何获得一个好的Ping

在多人游戏世界中,玩家要想获得良好的游戏体验,需要做很多事情——尤其是如果这种良好的体验取决于你的想法。 在线多人游戏,如FPS(第一人称射击游戏)、赛车和一些MMORPG类型的游戏,尤其取决于玩家对游戏反馈的及时有效反应。这个反馈和反应链有很多环节,其中一个环节是…

【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

最近在进行绘图时&#xff0c;遇到了matplotlib画散点图&#xff0c;并根据目标列的类别来设置颜色区间的问题&#xff0c;但是实现的过程较为艰辛。 文章目录 一、数据准备二、第一次尝试&#xff08;失败及其原因&#xff09;2.1 失败2.2 原因 三、第二次尝试&#xff08;成功…

详解客户关系管理系统

一、客户关系管理系统的重要性 客户关系管理系统&#xff0c;是指利用软件、硬件和网络技术&#xff0c;为企业建立一个客户信息收集、管理、分析和利用的信息系统。以客户数据的管理为核心&#xff0c;记录企业在市场营销和销售过程中和客户发生的各种交互行为&#xff0c;以…