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.rhkb.cn/news/350945.html

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

相关文章

C++11移动语义

前言 之前我们已经知道了在类里开辟数组后&#xff0c;每一次传值返回和拷贝是&#xff0c;都会生成一个临时变量 class Arr { public://构造Arr() {/*具体实现*/ };//拷贝Arr(const Arr& ar) {/*具体实现*/ };//重载Arr operator(const Arr& ar) { /*具体实现*/Arr …

Python高级编程:Functools模块的8个高级用法,强烈建议添加到你的开发工具箱中!

目录 1. functools.partial 2. functools.lru_cache lru_cache的特点 cache的特点 性能比较与选择 3. functools.reduce functools.reduce的作用 工作原理 示例 累加序列中的所有元素 计算阶乘 initializer的使用 应用场景 示例:计算平均销售额 小结 4. funct…

微前端乾坤方案

微前端乾坤方案 了解乾坤 官方文档 介绍 qiankun 是一个基于 single-spa 的微前端实现库&#xff0c;旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 qiankun 的核心设计理念 &#x1f944; 简单 由于主应用微应用都能做到技术栈无关&#xff0c;qiankun 对…

Java 桥接模式(Bridge Pattern)是设计模式中的一种结构型设计模式,桥接模式的核心思想是将抽象与实现解耦

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式的核心思想是将抽象与实现解耦&#xff0c;使得它们可以独立扩展。 在桥接模式中&#xff0c;通常包含以下四个…

DAY3-力扣刷题

1.罗马数字转整数 13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

最长不下降子序列LIS详解

最长不下降子序列指的是在一个数字序列中&#xff0c;找到一个最长的子序列&#xff08;可以不连续&#xff09;&#xff0c;使得这个子序列是不下降&#xff08;非递减&#xff09;的。 假如&#xff0c;现有序列A[1&#xff0c;2&#xff0c;3&#xff0c;-1&#xff0c;-2&…

16.大模型分布式训练框架 Microsoft DeepSpeed

微调、预训练显存对比占用 预训练LLaMA2-7B模型需要多少显存&#xff1f; 假设以bf16混合精度预训练 LLaMA2-7B模型&#xff0c;需要近120GB显存。即使A100/H100&#xff08;80GB&#xff09;单卡也无法支持。 为何比 QLoRA多了100GB&#xff1f;不妨展开计算下显存占用&…

誉天教育近期开班计划(6月15日更新)

云计算HCIP 周末班 2024/6/15 田老师 售前IP-L3 周末班 2024/6/15 陈老师 RHCA442 晚班 2024/6/17邹老师 数通HCIE 晚班 2024/6/24阮老师 云计算HCIE直通车晚班 2024/6/25 曾老师 售前IT-L3 周末班 2024/6/29 伍老师 数通HCIP 晚班 2024/7/1杨老师 存储直通车 晚班 2024/7/1 高…

从ES的JVM配置起步思考JVM常见参数优化

目录 一、真实查看参数 &#xff08;一&#xff09;-XX:PrintCommandLineFlags &#xff08;二&#xff09;-XX:PrintFlagsFinal 二、堆空间的配置 &#xff08;一&#xff09;默认配置 &#xff08;二&#xff09;配置Elasticsearch堆内存时&#xff0c;将初始大小设置为…

Windows Server 2008 r2 IIS .NET

Windows Server 2008 r2 IIS .NET

CleanMyMacX4.15.4如何优化苹果电脑系统缓存,告别MacBook卡顿,提升mac电脑性能

你是否曾为苹果电脑存储空间不够而烦恼&#xff1f;是否曾因系统运行缓慢而苦恼&#xff1f;别担心&#xff0c;今天我要给大家种草一个神器——CleanMyMac&#xff01;这款软件可以帮助你轻松解决苹果电脑的种种问题&#xff0c;让你的电脑焕然一新&#xff01; 让我来给大家介…

springboot原理篇-配置优先级

springboot原理篇-配置优先级&#xff08;一&#xff09; springboot项目一个支持三种配置文件 application.propertiesapplication.ymlapplication.yaml 其中&#xff0c;优先级的顺序是&#xff1a; application.properties > application.yml > application.yaml 也…

基于Nios-II实现流水灯

基于Nios-II实现流水灯的主要原理 涉及到FPGA&#xff08;现场可编程门阵列&#xff09;上的嵌入式软核处理器Nios II与LED控制逻辑的结合。以下是详细的实现原理&#xff0c;分点表示并归纳&#xff1a; Nios II软核处理器介绍&#xff1a; Nios II是Altera公司推出的一种应用…

Vue笔记(二)

Vue&#xff08;一&#xff09;&#xff1a;Vue笔记&#xff08;一&#xff09;-CSDN博客 目录 综合案例&#xff1a;水果购物车 生命周期 1.生命周期&生命周期四个阶段 2.生命周期函数&#xff08;钩子函数【8个】&#xff09; 3.生命周期两个案例 初始化渲染 自动获…

Node.js和npm的安装及配置

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞 I/O 的模型。 npm&#xff08;node package manager&#xff09;是一个 Node.js 包管理和分发工具&#xff0c;也是整个 Node.js 社区最流行、支持第三方模块最多的包管理器。使…

2024.6.14 作业 xyt

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c…

Unity2D计算两个物体的距离

1.首先新建一个场景并添加2个物体 2.创建一个脚本并编写代码 using UnityEngine;public class text2: MonoBehaviour {public GameObject gameObject1; // 第一个物体public GameObject gameObject2; // 第二个物体void Update(){// 计算两个物体之间的距离float distance Vec…

学习笔记——网络管理与运维——SNMP(SNMP架构)

三、SNMP架构 1、SNMP结构概述 SNMP被设计为工作在TCP/IP协议族上&#xff0c;基于TCP/IP协议工作&#xff0c;对网络中支持SNMP协议的设备进行管理。所有支持SNMP协议的设备都提供SNMP这个统一界面&#xff0c;使得管理员可以使用统一的操作进行管理&#xff0c;而不必理会设…

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 &#x1f349;技术核心 &#x1f349;引言 &#x1f348;标识 &#x1f348;背景 &#x1f348;项目概述 &#x1f348; 文档概述 &#x1f349;可行性分析的前提 &#x1f348;项目的要求 &#x1f348;项目的目标 &#x1f348;…

高才通通过后,香港身份证办理

高才通通过后&#xff0c;到香港前需要准备 身份证办理预约&#xff08;流程见下面&#xff09;办理好D签&#xff1a;在入境前&#xff0c;根据入境处给的签证&#xff0c;下载签证并办理港澳通行证D签&#xff08;逗留签&#xff09;携带的文书&#xff1a;港澳通行证&#…