LeetCode 算法:回文链表 c++

原题链接🔗:回文链表
难度:简单⭐️

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1
在这里插入图片描述

输入:head = [1,2,2,1]
输出:true

示例 2
在这里插入图片描述

输入:head = [1,2]
输出:false

提示

链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

题解

解决"回文链表"问题,我们可以采用以下几种解题思路:

1. 双指针法(快慢指针)

  • 目的:找到链表的中点。
  • 方法:使用两个指针,一个快指针(每次移动两个节点),一个慢指针(每次移动一个节点)。当快指针到达链表末尾时,慢指针即为中点。

2. 反转链表的后半部分

  • 目的:将链表的后半部分反转,以便可以直接比较。
  • 方法:从找到的中点开始,反转链表的后半部分。

3. 比较前半部分和反转后的后半部分

  • 目的:判断链表是否是回文。
  • 方法:使用两个指针,一个从链表头部开始,另一个从反转后的后半部分开始,逐个比较节点的值。

4. 恢复链表

  • 目的:在判断完是否是回文后,恢复链表的原始结构。
  • 方法:将反转的后半部分再次反转,以恢复链表的原始顺序。

5. 递归方法

  • 目的:递归地比较链表的首尾元素,然后对剩余部分递归进行判断。
  • 方法:定义一个递归函数,比较当前头节点和尾节点的值,如果相等,对子链表进行递归调用。

详细步骤

  1. 初始化两个指针slowfast,都指向头节点。
  2. 移动指针fast 每次移动两个节点,slow 每次移动一个节点,直到 fast 到达链表末尾或其下一个节点。
  3. 反转链表的后半部分:从 slow 节点开始,反转链表的后半部分。
  4. 比较链表的前半部分和反转后的后半部分:使用两个指针,一个从链表头部开始,另一个从反转后的后半部分开始,逐个比较节点的值。
  5. 判断是否是回文:如果所有值都匹配,则链表是回文的;如果有不匹配的值,则链表不是回文的。
  6. 恢复链表:如果需要,将反转的后半部分再次反转,以恢复链表的原始顺序。

注意事项

  • 在反转链表时,需要小心处理边界情况,如链表为空或只有一个节点。
  • 在比较过程中,确保比较的是相同位置的节点。
  • 如果使用递归方法,注意递归的终止条件和防止栈溢出。

通过上述步骤,你可以清晰地理解如何判断一个链表是否是回文,并选择适合的方法来实现算法。

快慢指针法

  1. 复杂度:时间复杂度O(n),空间复杂度O(1)。
  2. 过程
  • ListNode结构体:定义了链表的节点,包含整数值val和指向下一个节点的指针next。
  • Solution类:包含isPalindrome方法,用于判断链表是否是回文。
  • 快慢指针:在isPalindrome方法中,使用快慢指针找到链表的中点。
  • 反转链表:使用reverse辅助函数反转链表的后半部分。
  • 比较:使用两个指针比较链表的前半部分和反转后的后半部分。
  • 恢复链表:在比较完成后,再次调用reverse函数恢复链表的后半部分,以保持原始链表结构。
  • main函数:创建示例链表,调用isPalindrome方法,并输出结果。然后释放链表占用的内存。
  1. c++ demo
#include <iostream>// 定义链表节点
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:// 判断链表是否是回文bool isPalindrome(ListNode* head) {if (!head || !head->next) return true; // 空链表或只有一个节点是回文// 使用快慢指针找到链表中点ListNode* slow = head, * fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}// 反转链表的后半部分ListNode* secondHalf = reverse(slow);// 判断前半部分和反转后的后半部分是否相等ListNode* p1 = head, * p2 = secondHalf;bool isPalin = true;while (p2) {if (p1->val != p2->val) {isPalin = false;break;}p1 = p1->next;p2 = p2->next;}// 恢复链表的后半部分reverse(secondHalf);return isPalin;}private:// 反转链表的辅助函数ListNode* reverse(ListNode* head) {ListNode* prev = nullptr, * curr = head, * next = nullptr;while (curr) {next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}
};// 主函数,用于演示
int main() {Solution solution;// 创建一个示例链表: 1 -> 2 -> 2 -> 1ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(2);head->next->next->next = new ListNode(1);// 判断链表是否是回文bool isPalin = solution.isPalindrome(head);std::cout << (isPalin ? "链表是回文" : "链表不是回文") << std::endl;// 释放链表内存ListNode* current = head;while (current) {ListNode* next = current->next;delete current;current = next;}return 0;
}
  • 输出结果:

链表是回文
在这里插入图片描述

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

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

相关文章

1:25万基础电子地图(重庆版)

我们为你分享过四川版、江西版和贵州版的1:25万基础电子地图&#xff0c;现在再为你分享重庆版的电子地图。 现在我们再为你分享重庆的1&#xff1a;25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图重庆版 下载后可以看到该数据由14个压缩包所…

Windows11电脑在使用GPU的时候有时候会卡顿

原来我一直以为是电脑的某些组件可能坏掉了 但是后来发现通过更新gpu的驱动可以让它变好&#xff1a; NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA 下载好以后&#xff0c;然后安装最新的驱动就可以了&#xff0c;感觉可能是因为win11和某些需要显卡的驱动不支持的原因吧 …

Flash基础知识

1、Flash发展历程 存储器通常分为两类型&#xff0c;即随机存取的RAM&#xff08;内存&#xff09;与只读的ROM&#xff08;外存&#xff09;。 RAM&#xff0c;也称随机存取存储器&#xff0c;数据可以被读取和修改。它主要用于存储正在运行的程序和临时数据&#xff0c;是计…

CarService的构成和初始化分析

以下分析&#xff0c;基于安卓13的AAOS。 代码构成 packages/services/Car CarService相关代码&#xff0c;主要是在这个目录下 frameworks/opt/car/services 主要是carservice启动相关。 其它目录&#xff1a;audio_policy_configuration.xml和car_audio_configuration.xm…

人生的乐趣,在于对真知的追求

子曰&#xff1a;朝闻道&#xff0c;夕死可矣&#xff01; 孔子说&#xff1a;早上听到关于世界的真理&#xff0c;哪怕晚上就die了都可以。 这句话很有力量而经常被人引用&#xff0c;表达出我们如何看待沉重的肉身和精神世界。 我们的生活目的&#xff1a;道。 —— 要了解…

探究 IP 地址被网站封禁的原因

在我们登录各种网站、APP浏览时&#xff0c;可能会遇到 IP 地址被某些网站封禁的情况。很多人奇怪这是为什么呢&#xff1f; 首先&#xff0c;违反网站的使用规则是比较常见的原因之一。比如&#xff0c;频繁发送垃圾邮件、恶意评论、进行网络攻击或试图破解网站的安全机制等不…

数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 前文 一&#xff0c; 以…

【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别 无名管道&#xff1a; 它是半双工的&#xff0c;具有固定的读端和写端。 只能用于具有亲缘关系的进程之间的通信&#xff08;也是父子进程或者兄弟进程之间&#xff09;。 不是普通的文件&#xff0c;不属于其他任何文件系统&#xff0c;并且只存…

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …

深信服终端安全管理系统EDR版本升级过程

EDR当前版本为3.7.12&#xff0c;具体参考版本详情参数。需要升级到6.0.2R1版本&#xff0c;该版本更改了产品名称&#xff0c;叫做“统一端点安全管理系统aES” 当前版本详情 版本基础信息 软件版本&#xff1a;3.7.12.3829 病毒库版本&#xff1a;20240618174426 漏洞规则库&…

定制化物联网设备:开启智能生活新篇章

随着科技的进步&#xff0c;物联网&#xff08;IoT&#xff09;已成为我们日常生活和工作中不可或缺的一部分。从智能家居到工业自动化&#xff0c;物联网设备以其独特的功能和特性&#xff0c;极大地提高了我们的生活质量和工作效率。然而&#xff0c;在众多的物联网设备中&am…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中&#xff0c;如果能熟练掌握以下这些使用频率很高的脚本&#xff0c;那工作起来真的是手拿把攥&#xff0c;事半功倍&#xff0c;接下来给大家介绍一些我们日常使用率很高的一些脚本&#xff01; 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…

每年1-1.2万人毕业,男女比例约3:1,测绘工程的就业率如何

测绘工程&#xff0c;一个让人闻风丧胆的理科专业&#xff0c;虎扑评分4.2&#xff1a; 干过测绘的&#xff0c;苦不苦只有大家心里知道&#xff0c;带大家来感受一下&#xff0c;兄弟们的精神状态都十分美妙&#xff1a; 测绘专业到底是什么情况&#xff1f; PS.测绘分为本科…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理&#xff0c;主要规定了以下几个方面&#xff1a; 1. 漏洞发现与识别&#xff1a;要求定期进行漏洞扫描和评估&#xff0c;利用专业的漏洞扫描工具和安全服务&#xff0c;及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

文献解读-流行病学-第十期|《SARS-CoV-2 德尔塔和奥密克戎合并感染和重组的证据》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;流行病学&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Evidence for SARS-CoV-2 Delta and Omicron co-infections and recombination标题&#xff08;中文&#xff09;&#xf…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Qt|海康摄像头多个页面展示问题

为大家分享一个使用海康摄像头的小功能&#xff0c;希望对大家有用~ 使用场景&#xff1a; 在程序中多个不同功能页面需要展示摄像头的实时预览画面&#xff0c;该如何高效的展示呢&#xff1f; 对于海康摄像头的实时预览接口调用流程&#xff0c;如下所示&#xff1a; 按照流…

JS正则表达式构造函数和正则表达式字面量的区别

背景 笔者在使用正则表达式的过程中&#xff0c;经常看到两种使用方式&#xff0c;比较好奇这两种方式有什么不同。 一种是 正则表达式构造函数&#xff1a;new RegExp(“[xxx]”) 另一种是 正则表达式字面量&#xff1a; /[xxx]/ 于是&#xff0c;就去网上搜了一下…结果看到国…