当前位置: 首页 > news >正文

每日一练:回文链表

一、题目要求

给你一个单链表的头节点 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) 空间复杂度解决此题?

以上内容来自LeetCode

二、解法1-反转回文链表 进阶

        回文链表是对称的,只要将右边反转,那么两边就变成了一样的,此时进行比较,如果不同就不是回文链表。

class Solution {
public:bool isPalindrome(ListNode* head) {int count = 0;ListNode* cur = head;while (cur) {count++;cur = cur->next;}ListNode* curr = head;int half = count / 2 + count % 2; //链表长度是奇数,最中间的节点不用处理while (half--) {curr = curr->next;}if(curr == nullptr) // 如果链表只有一个节点return true;// 反转链表ListNode* prev = curr;curr = curr->next;prev->next = nullptr;while(curr){ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}cur = head;while(prev){if(prev->val != cur->val)return false;prev = prev->next;cur = cur->next;}return true;}
};

        

三、解法2-递归 进阶 

        解法1需要反转链表,这种方式不够优雅,我们可以用递归的方式遍历链表的右半部分,这样不用修改链表。

        主要思想是维护一个cur的二级指针,当curr到最后时才进行比较,相同则修改*cur指向下一个节点,然后函数返回,此时curr指向上一个节点,依次继续比较。

class Solution {bool _isPalindrome(ListNode** pcur, ListNode* curr) {if (curr == nullptr)return true;bool ret =  _isPalindrome(pcur, curr->next); if(ret == false) // 为假说明不对称return false;if (curr->val == (*pcur)->val) {(*pcur) = (*pcur)->next; // 修改curreturn true;}return false;}public:bool isPalindrome(ListNode* head) {int count = 0;ListNode* cur = head;while (cur) {count++;cur = cur->next;}ListNode* curr = head;int half = count / 2 + count % 2;while (half--) {curr = curr->next;}return _isPalindrome(&head, curr);}
};

相关文章:

  • 【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门
  • 并发编程 - GCD信号量
  • 内网与外网的区别
  • 【北京迅为】《STM32MP157开发板使用手册》- 第二十章 Trusted Firmware-A 移植+第二十一章 U-Boot移植
  • HarmonyOS开发实战( Beta5.0)自定义装饰器实践规范
  • 掌握Python自动化:探索keymousego库的无限可能!
  • Oracle OCP认证值得考吗? 需要门槛吗?
  • 【软件设计师真题】下午题第四大题---算法设计
  • 高基数 GroupBy 在 SLS SQL 中的查询加速
  • linux-进程管理-守护进程(Daemon)
  • 讯飞语音转文字怎么样?试试这4款工具吧!
  • 动态规划解决LCS问题
  • ElasticSearch底层原理解析
  • ESXI8.0 vsphere vcenter 多网卡多网段配置
  • OpenHarmony开发实战:动画样式(JS),2024年最新自学HarmonyOS鸿蒙
  • __proto__ 和 prototype的关系
  • Angular Elements 及其运作原理
  • create-react-app做的留言板
  • echarts花样作死的坑
  • ECMAScript入门(七)--Module语法
  • linux学习笔记
  • python 学习笔记 - Queue Pipes,进程间通讯
  • ViewService——一种保证客户端与服务端同步的方法
  • 百度地图API标注+时间轴组件
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​香农与信息论三大定律
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #WEB前端(HTML属性)
  • #数据结构 笔记一
  • (2020)Java后端开发----(面试题和笔试题)
  • (zt)最盛行的警世狂言(爆笑)
  • (二)PySpark3:SparkSQL编程
  • (二十六)Java 数据结构
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (转)关于多人操作数据的处理策略
  • (转)人的集合论——移山之道
  • .form文件_一篇文章学会文件上传
  • .gitignore文件设置了忽略但不生效
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 发展历程和版本迭代
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Standard 的管理策略
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken