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

news2024/10/7 4:28:29

🎁个人主页:我们的五年

🔍系列专栏:每日一练

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

 

目录

🏝问题描述:

🏝问题分析:

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

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

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

🏝节点为计数时分析:

🏝最终代码:


 前言:

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

●查找链表的中间节点

●逆置链表

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

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

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

🏝问题描述:

 对于一个链表,请设计一个时间复杂度为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 here
        struct 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.coloradmin.cn/o/1626073.html

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

相关文章

小红书美妆类笔记文案有哪些特点?

小红书作为一个分享和发现美好生活的平台,美妆护肤时尚类笔记在其中占据了重要的地位。这些笔记的文案特点通常表现为以下几点: 1.**情感化叙述**: 这类文案往往运用生动形象的词汇和细腻的情感表达,使文案更贴近读者的内心感受…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件(双击/demo/codebase/HCWebSDKPlugin.exe进行安装) 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意:以下操作都在Vue项目进行 5、复…

【笔试强训】除2!

登录—专业IT笔试面试备考平台_牛客网牛客网是互联网求职神器,C、Java、前端、产品、运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://ac.nowcoder.com/acm/…

MySQL面试——聚簇/非聚簇索引

存储引擎是针对表结构,不是数据库 引擎层:对数据层以何种方式进行组织 update:加索引:行级锁;不加索引:表级锁

BGP的基本概念和工作原理

AS的由来 l Autonomous System 自治系统,为了便于管理规模不断扩大的网络,将网络划分为不同的AS l 不同AS通过AS号区分,AS号取值范围1-65535,其中64512-65535是私有AS号 l IANA机构负责AS号的分发 AS之…

计算机体系结构与OS管理

冯诺依曼体系结构 我们只看数字信号(红色的线): 计算机数据的流动决定了计算机的效率,数据流动就是数据在不同地方的来回拷贝。 所以我们会采取让硬件设备直接与CPU链接的方式,所以就有了储存器了。储存器大大提升了效…

AppScan 扫描工具及使用

一、简介 原名 watchire Appscan ,2007年被IBM收购,成为IBM Appscan。IBM AppScan是一款非常好用且功能强大的Web 应用安全测试工具 曾以 Watchfire AppScan 的名称享誉业界,Rational AppScan 可自动化 Web 应用的安全漏洞评估工作,能扫描和检…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图,直接下载即可 transforms.Compose 是PyTorch中的一个实用工具,用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理,例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

【数据结构(邓俊辉)学习笔记】绪论05——动态规划

文章目录 0.前言1. Fibonacci数应用1.1 fib():递归1.1.1 问题与代码1.1.2 复杂度分析1.1.3 递归分析 1.2 fib():迭代 0.前言 make it work,make it right,make it fast. 让代码能够不仅正确而且足够高效地…

pytorch-激活函数与GPU加速

目录 1. sigmod和tanh2. relu3. Leaky Relu4. selu5. softplus6. GPU加速7. 使用GPU加速手写数据训练 1. sigmod和tanh sigmod梯度区间是0~1,当梯度趋近0或者1时会出现梯度弥散的问题。 tanh区间时-1~1,是sigmod经过平移和缩放而…

Golang | Leetcode Golang题解之第50题Pow(x,n)

题目: 题解: func myPow(x float64, n int) float64 {if n > 0 {return quickMul(x, n)}return 1.0 / quickMul(x, -n) }func quickMul(x float64, n int) float64 {if n 0 {return 1}y : quickMul(x, n/2)if n%2 0 {return y * y}return y * y * …

微服务组件-反向代理(Nginx)

微服务组件-反向代理(Nginx) Nginx 基本概念 1、nginx是什么? ①、Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器同时也提供了IMAP/POP3/SMTP服务。它是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器&a…

Linux--内核移植(一)Kernel编译启动

Linux内核编译 编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为: sudo apt-get install lzop sudo apt-get install build-essential sudo apt-get install libncurses5-dev 在U…

大数据时代的引擎:大数据架构随记

大数据架构通常可以分为以下几层: 一、数据采集层 负责从各种数据源采集、清洗、转换、丰富以及格式化数据,可能包括结构化、半结构化和非结构化的数据。 1.1、常用的技术 在大数据领域,数据采集是一个关键的环节,常用的数据采集…

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)

sbt下载官网 选择对应的版本和安装程序 Download | sbt (scala-sbt.org) 安装 解压 将sbt-1.9.0.tgz上传到xshell,并解压 解压: tar -zxvf sbt-1.9.0.tgz 配置 1、在/home/hadoop/sbt中创建sbt脚本 /home/hadoop/sbt 注意要改成自己的地址 cd …

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

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

小型内衣裤洗衣机哪个牌子好?六大选购锦囊私藏分享

内衣洗衣机是现代家庭必不可少的小家电,它不仅方便快捷,还能够保持衣物清洁和卫生。然而,市场上洗衣机品牌众多,质量和性能参差不齐,使得消费者购买时难以做出选择。那么,小型内衣裤洗衣机哪个牌子好&#…

企业OA管理|基于SprinBoot+vue的企业OA管理系统(源码+数据库+文档)

企业OA管理目录 基于SprinBootvue的企业OA管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 公告信息管理 1.3 客户关系管理 1.4 通讯录管理 2 用户模块的实现 2.1 客户关系添加 2.2 通讯录添加 2.3 日程安排添加 四、…

7-32 说反话-加强版

题目链接:7-32 说反话-加强版 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 str1 input().split(\n)[0] // 按行获取输入 list_str str1.split()[::-1] // 按空格分割为字符串组,然后将字符串组逆序 str1 .join(list_str) //…

LCD液晶显示屏强光老化测试设备太阳光模拟器仪器

1. LCD液晶显示屏老化测试的意义 LCD液晶显示屏老化测试是评估显示屏寿命和性能的重要手段。随着科技的发展,LCD液晶显示屏已经成为我们日常生活中不可或缺的一部分。长期使用后,LCD液晶显示屏可能会出现亮度下降、颜色失真、响应速度变慢等问题。通过进…