【初阶数据结构】——牛客:OR36 链表的回文结构

news/2024/5/3 2:47:37

文章目录

  • 1. 题目介绍
  • 2. 思路分析
  • 3. 代码实现

1. 题目介绍

链接: link
在这里插入图片描述
这道题呢是让我们判断一个链表是否是回文结构。但是题目要求设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法。
所以如果我们想把链表的值存到一个数组中再去判断就不可行了。

2. 思路分析

那对于这道题呢比较好的一个思路是这样的:

不是要判断链表是否是回文结构嘛。
回文结构的话就是从中间分开,两边是对称的嘛(比如:1,2 | 2,1),当然如果是奇数个结点的话就是以中间结点为对称轴(比如:1 2 3 2 1)。
那我就可以这样做:
找到链表的中间结点,将从中间结点开始往后的部分进行逆置(如果是偶数个有两个中间结点就从第二个开始)。
后半部分逆置之后,我们比较这两部分是否相同,如果相同,他就是回文结构。

单凭上面的文字大家可能还不是特别清楚,下面我们来画个图分析一下:

就以1 2 2 1为例:
在这里插入图片描述
首先找到中间结点是2(第二个2),这里找链表中间结点我们前面就做过这个题,到时候就可以直接用。
那逆置之后就是这样
在这里插入图片描述
链表逆置之前我们也写过对应的OJ题,待会也可以直接用。那逆置之后我们可以拿到逆置之后后半部分链表的头指针。
同时题目给了我们原链表的头指针。
在这里插入图片描述
在这里插入图片描述
那然后我们就可以同时从这两个头指针开始往后遍历,依次两个比较每对结点,如果某次比较不相同,那就不是回文结构,直接返回false。
如果是回文结构,就一直向后比,所以肯定要写成循环,那循环什么时候结束呢?
🆗,后半部分链表逆置之后最后一个结点指向空,所以如果遍历到rhead为空,还没返回false,那就是全部相同,他就是回文结构,此时循环结束,返回true。

但是上面我们分析的是偶数个结点的情况,如果是奇数个,还适用吗?

🆗,是可以的。
以1 2 3 2 1为例
在这里插入图片描述
逆置后半部分之后是这样子。
然后还是两两比较,1 2相等,2 2 相等
在这里插入图片描述
此时我们看到对于前半部分链表来说,到2就遍历完了。后半部分虽然每遍历完,但是奇数个的话,他最后剩下的那个就是原链表最中间的那个结点。
那中间结点的左右两部分都相等了,其实已经证明是回文了,就可以结束了。
所以逆置之后是不是应该把前半部分的尾结点next置空,这样只要有一个链表走到空就结束,就是回文。
可以置空,但是其实没必要。而且要置空的话还得保存一下中间结点的前一个,怪麻烦的。
在这里插入图片描述
我们看到,不置空的话,此时前半部分的尾结点(这里是2)指向谁?
就是原链表的中间结点,所以可以继续向后比较,自己跟自己比,肯定相同,那再往后后半部分链表就走到空了。循环结束,返回true。
如果不是回文链表,中间比较的时候不相同就直接返回false了。
所以不需要将前半部分尾结点next置空,循环结束的条件就是后半部分链表走到空。

3. 代码实现

那我们来写一下代码:

在这里插入图片描述
这两个函数我就直接拷贝之前我们写过的代码了,之前的文章我们都讲过,大家可以去看。
在这里插入图片描述

就搞定辽!

在这里插入图片描述
提交一下:
在这里插入图片描述
过啦!

class PalindromeList {public:struct ListNode* reverseList(struct ListNode* head) {struct ListNode* newhead = NULL;struct ListNode* cur = head;struct ListNode* tmp = NULL;while (cur) {//保存下一个的地址tmp = cur->next;//头插cur->next = newhead;newhead = cur;cur = tmp;}return newhead;}struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;}bool chkPalindrome(struct ListNode* A) {struct ListNode* midnode=middleNode(A);struct ListNode* rhead=reverseList(midnode);while(rhead){if(A->val!=rhead->val)return false;A=A->next;rhead=rhead->next;}return true;}
};

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

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

相关文章

Diffusion添加噪声noise的方式有哪些?怎么向图像中添加噪声?

添加噪声的方式大致分为两种,一种是每张图像在任意timestep都加入一样的均匀噪声,另一种是按照timestep添加不同程度的噪声 一、在任意timestep都加入一样的noise batch_size 32x_start torch.rand(batch_size,3,256,256) noise torch.randn_like(x_…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时,一般要及时测试开发的接口能否正确接收和返回数据,对于单次测试,Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求,而对于模拟多用户并发等性能测试&#xf…

五年前端的面试之旅

哈喽我是树酱,最近整理了下前端面试相关的知识题库,借此分享给各位小伙伴,帮助小伙伴早日拿到钟意的offer! 前言 最近就业市场不景气,跟大环境较差也有关,确实给我们也会带来一定的挑战。在招聘网站投简历的…

中国象棋AI在线对弈游戏源码

源码介绍 这是一款html5小游戏,主要功能在于js,带一套皮肤、内置ai算法,有能力的可以自行修改。 源码截图 下载地址 链接:https://pan.baidu.com/s/1fYp1HWsd91nJOdX1M8RFtQ?pwdh2iz 提取码:h2iz

ArcGIS二次开发(一)——搭建开发环境以及第一个简单的ArcGIS Engine 程序

Arcgis10.2、Arcgis Engine10.2与Microsoft Visual Studio 2012的版本进行安装 1、推荐教程与安装包2、安装顺序3、安装成功测试VS新建项目可以创建ArcGIS项目,并且在VS中拖拽ArcGIS工具 4、搭建第一个简单的ArcGIS Engine 程序 ArcEngine和VS版本是有对应的&#x…

RVM安装ruby笔记

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…