【牛客网】:链表的回文结构(提升)

🎁个人主页:我们的五年

🔍系列专栏:每日一练

🌷追光的人,终会万丈光芒

 

目录

🏝问题描述:

🏝问题分析:

 步骤一:查找链表的中间节点

步骤二:对包括中间节点以后的节点进行逆置

 步骤三:两个头指针相互往后遍历

🏝节点为计数时分析:

🏝最终代码:


 前言:

这道题在链表中属于较难的题目,但是题目中我们用已经学过得基本步骤去改一下就很简单了,这道题应用的基本步骤就是:

●查找链表的中间节点

●逆置链表

这些基本步骤我都放在了这篇文章中:链表必写的四道基础题

牛客网链接:链表的回文结构_牛客题霸_牛客网

下面就让我们来看看这道题怎么解决:

🏝问题描述:

 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

🏝问题分析:

假如上面是一个双链表,我们只要那到链表的头节点和尾节点,然后两个头都往中间进行遍历,如果出现val不相等,我们就返回false,最后没有提前返回false,我们就返回true。

可惜上面的不是双向链表,但是我们想,单链表我们只能1>2,然后2>1,刚好和1>2和1>2相反,如果我们可以把后面的链表逆置一下,我们就可以做到前面一半也是1>2,后面一半也是1开头,然后1>2,这样就能对上了,下面我们来进行实现

先以上面的测试用例为例子:

 步骤一:查找链表的中间节点

我们先查找中间节点,如果节点个数为偶数,那么我们找到的就是中间节点的第二个节点,比如上面的例子我们找到的就是第三个节点。

查找中间节点的函数的实现:

    struct ListNode* MidNode(struct ListNode* ps)

        {

            struct ListNode* fast=ps;

            struct ListNode* slow=ps;

            if(fast&&fast->next)

            {

                fast=fast->next->next;

                slow=slow->next;

            }

            return slow;

        }

步骤二:对包括中间节点以后的节点进行逆置

实现函数:

    ListNode* reverselist(ListNode* ps)

    {

        ListNode* newhead=NULL;

        while(ps)

        {

            ListNode* pnext=ps->next;

            ps->next=newhead;

            newhead=ps;

            ps=pnext;

        }

        return newhead;

    }

对后半段的节点进行逆置以后,链表就变成这样:

 步骤三:两个头指针相互往后遍历

也就是两个1节点为头,然后每走一步,比较两个节点的val。如果不相同我们就返回false,如果相同就一直一直往后面走,走到一个为NULL为止,走到NULL还没有提前返回false,我们就返回true。

🏝节点为计数时分析:

上面我们分析的是节点为偶数个,下面我们来看看节点个数为奇数个时的情况:

 现在我们查找中间节点就是3节点,然后我们进行逆置以后,链表就变成这样了:

这种情况我们好像我们进行遍历也是没有什么问题的,所以我们只要去查找中间节点,然后进行逆置,然后遍历判断,这道题就完成了。

🏝最终代码:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/   
class PalindromeList {
public://查找中间节点的函数struct ListNode* MidNode(struct ListNode* ps){struct ListNode* fast=ps;struct ListNode* slow=ps;if(fast&&fast->next){fast=fast->next->next;slow=slow->next;}return slow;}//逆置链表ListNode* reverselist(ListNode* ps){ListNode* newhead=NULL;while(ps){ListNode* pnext=ps->next;ps->next=newhead;newhead=ps;ps=pnext;}return newhead;}bool chkPalindrome(ListNode* A) {// write code herestruct ListNode* mid=MidNode(A);struct ListNode* remid=reverselist(mid);//进行判断while(A&&remid){if(A->val!=remid->val)return false;A=A->next;remid=remid->next;}return true;}
};

 总结:

这道题算是对链表的一个小小提升,这道题目也告诉了我,一定要学好基本的知识点,把基本的知识点用的很熟练以后,才能去解决很难得题目,后期我还会带来很多值得思考,值得我们写一写的题目。如果觉得这篇文章写的好的铁子可以点点关注,祝大家天天开心!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 讯飞录音 点击按钮录音内容转文字

<page-meta page-style"{{ showPolish ? overflow: hidden; : }}" /> <view class"wrap"> <view class"header-tab" style"justify-content: {{typeList.length > 2 ? start : center}}"><view class&quo…

前端开发攻略---用原生JS在网页中也能实现文本转语音

1、原理 语音合成 (也被称作是文本转为语音&#xff0c;英语简写是 tts) 包括接收 app 中需要语音合成的文本&#xff0c;再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis&#xff0c;外加一些处理如何表示要被合成的文本 (也被称为 utte…

MySql 主从同步-在原来同步基础上增加历史数据库

在MySql已经主从同步的后&#xff0c;由于有新的需求再增加1个历史数据库&#xff0c;要改原来的1个变成现在的2个数据库。在官网并没有找到类似的场景&#xff08;官方同步多个数据是从一开始就设置&#xff0c;不是后续增加的&#xff09;&#xff0c;只能结合以往的经验自己…

Weblogic一个domain建多个server(端口)

一、基本环境 名称IP端口说明AdminServer192.168.20.207001管理服务WRServer192.168.20.207001提供应用服务 1、启动weblogic服务 二、操作步骤 在weblogic控制台。环境-服务器-新建 填写服务器名称-监听地址-监听端口-点击完成 2、按照web应用 3、启动服务 /home/weblogic/…

(二十九)加油站:面向对象重难点深入讲解【重点是元类】

目录&#xff1a; 每篇前言&#xff1a;0. Python中的元类&#xff1a;1. 本文引子&#xff1a;2. Python中的mro机制&#xff1a;3. Python中类的魔法属性dict&#xff1a;注意事项&#xff1a; 拓展——内建函数dir() 4. 正式谈一谈元类&#xff08;metaclass&#xff09;:&a…

小酒馆点餐系统实现-C++项目详细过程

目录 项目介绍1、项目描述2、市场调研3、技术调研 项目设计1、概要设计2、详细设计① 数据管理模块&#xff1a;② 业务控制模块&#xff1a;③ 前端界面模块&#xff1a; 3、代码实现实现数据管理模块实现业务控制模块实现前端界面模块 项目介绍 1、项目描述 使用户可以通过…

Nacos 安全零信任实践

作者&#xff1a;柳遵飞 Nacos 作为配置中心经常存储一些敏感信息&#xff0c;但是由于误用导致安全风险&#xff0c;最常见的主要是以下两个问题&#xff1a; 1&#xff09;Nacos 暴露公网可以吗&#xff1f;不可以&#xff0c;因为 Nacos 定位是注册配置中心&#xff0c;是…

RoadBEV:鸟瞰图中的道路表面重建

1. 代码地址 GitHub - ztsrxh/RoadBEV: Codes for RoadBEV: road surface reconstruction in Birds Eye View 2. 摘要 本文介绍了RoadBEV&#xff1a;鸟瞰图中的道路表面重建。道路表面条件&#xff08;特别是几何形状&#xff09;极大地影响了自动驾驶汽车的驾驶性能。基于…

浏览器渲染机制:重排(Reflow)与重绘(Repaint)以及Vue优化策略

浏览器渲染机制是一个复杂但有序的过程&#xff0c;其目的是将HTML、CSS和JavaScript代码转化为用户可以看到和交互的视觉界面。重排&#xff08;Reflow&#xff09;与重绘&#xff08;Repaint&#xff09;是浏览器渲染过程中对页面元素进行更新的两个重要步骤&#xff0c;理解…

QML中使用正则表达式

我想在TextField控件中使用正则表达式&#xff0c;然后GPT4给出的回答是这样的&#xff1a; TextField {id: versionInputplaceholderText: qsTr("输入版本号")validator: RegExpValidator { regExp: /^[a-zA-Z0-9]*$/ } // 仅允许字母和数字width: 120 // 设置合…

Linux系统-DHCP原理与配置

目录 一.DHCP工作原理 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 4.DHCP的租约过程 二.DHCP服务器的配置 1.首先先关闭防火墙 2. 安装DHCP有关软件包 3.查看系统的配置文件​编辑 4.设置参数 5.网络配置 一.DHCP工作原理 1.了解DHCP服务 DHCP(Dynamic Hos…

【Linux】详解信号产生的方式

一、kill命令 在命令行中通过kill -数字 pid指令可以给指定进程发送指定信号。这里说明一下几个常见的信号&#xff1a; SIGINT&#xff08;2号信号&#xff09;&#xff1a;中断信号&#xff0c;通常由用户按下CtrlC产生&#xff0c;用于通知进程终止。SIGQUIT&#xff08;3号…