每日一题---OJ题: 链表的回文结构

片头

嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题--- 链表的回文结构

嗯...这道题好像不是很难,我们来分析分析

举个例子:

我们可以看到,上图中的两个链表都是回文结构: 即链表的回文结构是指一个链表中的结点值从前往后读和从后往前读都是一样的结构。也就是说,链表的顺序是回文的。

例如,以下链表是回文结构: 1 -> 2 -> 3 -> 2 -> 1

而以下链表不是回文结构: 1 -> 2 -> 3 -> 4 -> 5

那我们怎么判断是不是链表的回文结构呢?

思路1 : 我们可以先找到链表的中间结点,然后反转从这个中间结点开始一直到最后一个结点,并且将反转后的新结点返回,最后定义两个变量,分别去遍历链表的头结点和新结点

比如:

我们定义2个变量,A表示指向链表的头结点(第一个结点),rmid 表示指向反转链表返回的新结点

我们让 A 和 rmid 指向的结点依次比较,如果中途 A 指向结点的值不等于rmid结点指向的值,那么直接退出循环,返回 false;如果比较到 A 和 rmid 都为, 那么返回 true

第一次比较:  A 和 rmid 指向的结点的数据域都相等, 那么指针 A 向后走一步, 指针 rmid 向后走一步

第二次比较: A 和 rmid 指向的结点的数据域都相等, 那么指针 A 向后走一步, 指针 rmid 向后走一步

第三次比较: rmid指针指向NULL, 退出循环, 返回 true 

我们查找链表的中间结点的代码如下:

    //找出中间结点struct ListNode* Find(struct ListNode* head){struct ListNode* fast = head;            //fast指针指向第一个结点struct ListNode* slow = head;            //slow指针指向第一个结点while(fast && fast->next){            // 当 fast 并且 fast->next 不为空时,进入循环                   slow = slow->next;                //slow指针每次走一步fast = fast->next->next;          //fast指针每次走两步}return slow;                          //返回slow指针指向的结点,就是中间结点}

具体的关于链表的中间结点讲解在这里哦, 小伙伴们可以点击查看:  链表的中间结点

我们找到链表的中间结点后,我们就可以反转从这个中间结点开始一直到最后一个结点

反转链表的代码如下:

    //反转链表struct ListNode* Reverse(struct ListNode* head){struct ListNode* n1 = nullptr;            //定义一个n1指针指向NULLstruct ListNode* n2 = head;               //定义一个n2指针指向头结点struct ListNode* n3 = head->next;         //定义一个n3指针指向头结点的下一个结点while(n2 != nullptr){                     //判断n2是否为空n2->next = n1;                        //如果n2非空,就把n2的next指针指向n1n1 = n2;                              //把n2赋给n1n2 = n3;                              //把n3赋给n2if(n3){                               //如果n3非空,就让n3指向n3的下一个结点n3 = n3->next;}}return n1;                                //最后n2和n3都为空,n1恰好是新链表的头结点}

具体的关于反转链表的讲解可以戳这里哦,小伙伴们可以点击查看:  反转链表

好啦,准备工作做好了以后,我们就可以在题目所给的方法里面写代码啦!

首先,我们要定义一个结点指针,用来接收返回过来的中间结点;  其次,我们需要定义另外一个结点指针,用来接收反转链表后的新结点。

将两个指针所指向的结点进行比较,如果它们的数据域不同,说明链表不是回文结构, 则跳出循环, 返回 false ; 如果数据域相同,那么两个指针同时往后走一步,继续比较下一个结点,直到其中一个指针指向NULL, 说明链表是回文结构, 返回 true。

整体代码如下:

class PalindromeList {public://找出中间结点struct ListNode* Find(struct ListNode* head) {struct ListNode* fast = head;            //fast指针指向第一个结点struct ListNode* slow = head;            //slow指针指向第一个结点// 当 fast 并且 fast->next 不为空时,进入循环while (fast && fast->next) {         slow = slow->next;         //slow指针每次走一步fast = fast->next->next;   //fast指针每次走两步}return slow;                   //返回slow指针指向的结点,就是中间结点}//反转链表struct ListNode* Reverse(struct ListNode* head){//定义一个n1指针指向NULLstruct ListNode* n1 = nullptr;           //定义一个n2指针指向头结点struct ListNode* n2 = head;              //定义一个n3指针指向头结点的下一个结点struct ListNode* n3 = head->next;while(n2 != nullptr){       //判断n2是否为空n2->next = n1;          //如果n2非空,就把n2的next指针指向n1n1 = n2;                //把n2赋给n1n2 = n3;                //把n3赋给n2if(n3){                 //如果n3非空,就让n3指向n3的下一个结点n3 = n3->next;}}return n1;                 //最后n2和n3都为空,n1恰好是新链表的头结点}bool chkPalindrome(ListNode* A) {//定义mid指针,用来接收中间结点struct ListNode* mid = Find(A);    //定义r指针,用来接收将链表反转后的新结点 struct ListNode* r = Reverse(mid); ListNode* pcur = A;//当两个指针都不为空时,进入while循环while (pcur && r) {//如果两个指针指向的结点的数据域不相同,说明链表不是回文结构,那么返回 falseif (pcur->val != r->val) {return false;}//如果两个指针指向的结点数据域相同,那么继续比较下一个结点pcur = pcur->next;r = r->next;}//其中一个指针走向NULL,说明是链表回文结构,返回 truereturn true;}
};

片尾

今天我们学习了一道OJ题: 链表的回文结构,里面涉及了查找链表的中间结点以及反转链表等知识,希望看完这篇文章的能对友友们有所帮助 !  !  !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

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

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

相关文章

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

前端服务请求跨域被拦截,Java后端Springboot服务解决办法

跨域问题 跨域前端遇到的问题&#xff1a; Access to XMLHttpRequest at ‘http://www.xxx.xxxx/api/x/d/xc’ from origin ‘http://127.0.0.1:3000’ has been blocked by cors policy: No ‘Access-Contorl-Allow-Origin’ header is present on the requested resource. …

npm创建Vue3项目

npm创建Vue3项目 1 创建Vue项目说明 2 安装3 运行 1 创建Vue项目 创建最新版的Vue项目&#xff0c;已经不推荐使用CLI构建方式了。参考如下即可。 npm create vuelatest如果发现一直动不了&#xff0c;切换网络试一下&#xff0c;个人热点尝试一下。 按下图的选项按需引入自…

flask后端+网页前端:基于 socket.io 的双向通信和服务器部署

我想实现的效果是&#xff0c;我的服务器提供两个路由网址&#xff0c;网页A用于拍照、然后录音&#xff0c;把照片和录音传给服务器&#xff0c;服务器发射信号&#xff0c;通知另一个路由的网页B更新&#xff0c;把刚刚传来的照片和录音显示在网页上。 然后网页B用户根据这个…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前&#xff08;idea默认字体为 JetBrains Mono&#xff09; 2.设置后&#xff08;楷体&#xff09;

关于游戏当中击退/击飞效果的制作

关于游戏当中击退/击飞效果的制作 在游戏当中我们免不了会有一些炫酷的效果&#xff0c;特别是RPG游戏&#xff0c;比如放一个技能&#xff0c;直接大范围杀伤&#xff0c;然后把敌人全部击飞或者击退&#xff0c;那效果真的很舒服。把自己想象成武林高手&#xff0c;一套江湖…

Debian 安装 Docker

Debian 安装 Docker。 这是官方安装文档 Install Docker Engine on Debian | Docker DocsLearn how to install Docker Engine on Debian. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/i…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片&#xff0c;类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码&#xff01; 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

软考高级架构师:数据库模式概念和例题

一、AI 讲解 数据库模式分为三个层次&#xff1a;外模式、概念模式和内模式。这三个层次分别对应不同的抽象级别&#xff0c;帮助数据库管理员和用户以不同的视角理解数据库结构。 外模式&#xff08;用户级&#xff09;&#xff1a;是数据库用户的视图。每个用户可以通过外模…

Banana Pi BPI-M7 RK3588开发板运行RKLLM软件堆AI大模型部署

关于Banana Pi BPI-M7 Banana Pi BPI-M7 采用Rockchip RK3588&#xff0c;板载8/16/32G RAM内存和 64/128G eMMC存储&#xff0c;支持无线wifi6和蓝牙5.2。2x2.5G网络端口&#xff0c;1个HDMIout标准 输出口&#xff0c;2x USB3.0&#xff0c;2xTYPE-C&#xff0c;2x MIPI CSI…

DAY03|203.移除链表元素、707.设计链表、206.反转链表

203.移除链表元素、707.设计链表、206.反转链表 LeetCode 203.移除链表元素LeetCode 707.设计链表LeetCode 206.反转链表双指针法递归法 LeetCode 203.移除链表元素 注意&#xff0c;在dummy上操作&#xff0c;返回也返回dummy->next 如果头铁想返回head&#xff0c;那样会…