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,一经查实,立即删除!

相关文章

spdlog学习笔记

学习spdlog的一些记录 项目下载 git clone https://github.com/gabime/spdlog.git 创建异步日志器 void initSpdlog(const std::string& strPath) {std::string strLogPath strPath "/logs/skyense.log";// 异步就一定需要线程或线程池日志队列,这里给一个线…

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

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

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

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

2024前端面试准备5-React相关

1. React 事件机制 ​ React并不是直接把事件绑定到div的真实DOM上的&#xff0c;而是在document(>16绑定的document,17开始绑定到root元素&#xff0c;方便微前端处理)处通过事件代理的方式&#xff0c;统一绑定了所有事件&#xff0c;然后根据冒泡上来的事件&#xff0c;…

Flash基础知识

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

redis穿透解决方案

Redis缓存穿透是指查询一个不存在于数据库中的数据&#xff08;通常是恶意用户发起的连续请求&#xff09;&#xff0c;由于缓存中没有&#xff0c;每次请求都会穿透到数据库&#xff0c;这可能会对数据库造成不必要的压力。解决缓存穿透问题的常见策略包括&#xff1a; …

CarService的构成和初始化分析

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

Unity Texture2D读取像素时出错问题

Texture2D在读取像素处理时&#xff0c;经常会出错&#xff0c;这个时候可以用如下函数先转换&#xff1a; public Texture2D DeCompress(Texture2D source){RenderTexture renderTex RenderTexture.GetTemporary(source.width,source.height,0,RenderTextureFormat.Default,R…

leetcode-12-[226]翻转二叉树[101]对称二叉树[104]二叉树的最大深度[111]二叉树的最小深度

前置知识&#xff1a; 深度&#xff1a;任意节点到根节点的节点数 高度&#xff1a;任意节点到叶子节点&#xff08;左右孩子都为空&#xff09;的节点数 一、[226]翻转二叉树 重点&#xff1a;交换节点应该传入根节点 class Solution {public TreeNode invertTree(TreeNo…

JSON学习

一、JSON 1.1 简介 JSON&#xff1a;JavaScript Object Notation是一种表示对象的方式 基于JavaScript语言的轻量级的数据交换格式;&#xff08;即:用来传输数据的一种格式&#xff09; 现在传输数据的方式更多是采用json的格式&#xff0c;渐渐代替了XML 1.2 JSON的数据表示 …

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

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

MongoDB查询

一、find 1、简单查询 #查寻所有文档 >db.foo.find()#查询包含namehgq的文档 >db.foo.find({"name":"hgq"}) #查询包含namehgq&#xff0c;age12的文档&#xff0c;默认为全部条件都匹配 >db.foo.find({"name":"hgq","…

探究 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 漏洞规则库&…

【安全边界】

1.安全边界是什么 安全边界是具有不同安全要求或需求的任意两个区域、子网或环境之间的交叉线。它存在于高安全性区域和低安全性区域之间&#xff0c;例如局域网&#xff08;LAN&#xff09;和互联网&#xff08;Internet&#xff09;之间。 2.为什么要建设安全边界 安全边界…

PHP入门教程5:会话管理和数据库操作

PHP入门教程5&#xff1a;会话管理和数据库操作 在前几篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构、函数的使用、数组和字符串的操作&#xff0c;以及文件处理和表单处理。本文将重点介绍PHP中的会话管理和数据库操作&#xff0c;这是构建动态网站和Web应用程序的…

java.sql.Timestamp用法总结

java.sql.Timestamp用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 概述 java.sql.Timestamp是Java中表示日期和时间的类&#xff0c;它继承自jav…