每日一题——回文链表
回文链表
题目链接
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvuT2cBE-1691217006189)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230805111025312.png)]](https://img-blog.csdnimg.cn/b090622b8263425eabdfd9e393f71115.png)
回文结构即字符串正序逆序完全一致,如“1 2 3 4 3 2 1”,那么我们就要想办法同时比较链表头和链表尾的元素,看其是否相等。
下面介绍一种最常用的方法:
思路
如果我们仔细观察回文结构,就会得到一个结论:
将一个回文结构从正中间分隔,再将后半部分逆序,那么前半部分就一定等于后半部分。
我们可以分链表长度为奇数和偶数讨论:
当长度为偶数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJGE5AkL-1691217006190)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230805132642866.png)]](https://img-blog.csdnimg.cn/41c32e8a3bb34560adbaa5b7789615d0.png)
当长度为奇数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tnzqfbdq-1691217006190)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230805132749391.png)]](https://img-blog.csdnimg.cn/8c78f72d1aec4a4d8d3f0d47126e3cf8.png)
- 那么**,第一步就先要得到链表的中间节点。我们可以用快慢指针**来实现:
定义两个指针fast、slow,同时指向链表头,slow每次走一个,fast每次走两个节点,当fast->next == NULL 或者 fast == NULL时,slow就走到中间节点了
struct ListNode* slow = head;
struct ListNode* fast = head;while (fast && fast->next)
{slow = slow->next;fast = fast->next->next;
}
- 第二步,就是反转以
slow节点为头的链表,如果对单链表反转还不太了解的朋友,建议先看看👉反转单链表
struct ListNode* reverseList(struct ListNode* head)
{if (head == NULL)return NULL;struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));newHead->next = head;struct ListNode* cur = head;while (cur->next){struct ListNode* curNext = cur->next;cur->next = curNext->next;curNext->next = newHead->next;newHead->next = curNext;}struct ListNode* retHead = newHead->next;free(newHead);return retHead;
}
- 第三步,我们用指针
mid来接受slow后链表反转过后的头,接下来,从原来链表的头和mid开始比较,只要遇到不相等的情况,就返回false,否则返回true。
struct ListNode* mid = reverseList(slow->next);
struct ListNode* cur1 = head;
struct ListNode* cur2 = mid;while (cur1 && cur2)
{if (cur1->val != cur2->val){return false;}cur1 = cur1->next;cur2 = cur2->next;
}return true;
- 最后一步,**在返回之前,需要将链表还原,**毕竟在现实生活中,没有人想再调用这个函数时改变原来的链表结构。但是,如果我们就按上面的操作进行还原,那么就会出现一系列的问题,我们拿下图说明
判断过后,链表的结构是这样的:

如果我们要将链表还原,那么问号处的节点的后面应该链接到reverseList(mid)的返回值,但问题是之前我们并没有保存问号处的节点。所以,我们可以对找到链表中间节点这一操作进行改进:
struct ListNode* slow = head;
struct ListNode* fast = head;while (fast->next && fast->next->next)
{slow = slow->next;fast = fast->next->next;
}
这样slow就会停留在问号处的位置,反转链表的时候就反转以slow->next为头的链表就行了
实现代码
struct ListNode* reverseList(struct ListNode* head) //反转链表
{if (head == NULL)return NULL;struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));newHead->next = head;struct ListNode* cur = head;while (cur->next){struct ListNode* curNext = cur->next;cur->next = curNext->next;curNext->next = newHead->next;newHead->next = curNext;}struct ListNode* retHead = newHead->next;free(newHead);return retHead;
}bool isPalindrome(struct ListNode* head){struct ListNode* slow = head;struct ListNode* fast = head;while (fast->next && fast->next->next) //找到中间节点的前一个节点{slow = slow->next;fast = fast->next->next;}//反转以中间节点为头的链表//将返回值赋给midstruct ListNode* mid = reverseList(slow->next); struct ListNode* cur1 = head;struct ListNode* cur2 = mid;bool ret = true; //设置返回值while (cur1 && cur2){if (cur1->val != cur2->val){ret = false; //只要出现不相等的情况,就将返回值设为false,推出比较break;}cur1 = cur1->next;cur2 = cur2->next;}//还原链表mid = reverseList(mid);slow->next = mid;//返回return ret;
}
相关文章:
每日一题——回文链表
回文链表 题目链接 回文结构即字符串正序逆序完全一致,如“1 2 3 4 3 2 1”,那么我们就要想办法同时比较链表头和链表尾的元素,看其是否相等。 下面介绍一种最常用的方法: 思路 如果我们仔细观察回文结构,就会得到一…...
OPENCV C++(一) 二进制和灰度原理 处理每个像素点值的方法
#include <opencv2/opencv.hpp> using namespace std; using namespace cv;必须包含的头文件! 才能开始编写代码 读取相片 一般来说加个保护程序 不至于出error和卡死 Mat image imread("test.webp"); //存放自己图像的路径 if (image.empty()){p…...
Python GUI编程(Tkinter)
Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows …...
K8S简介
目录 前言K8S 简介K8S 是什么作用Kubernetes 主要功能如下:Kubernetes 集群架构与组件 核心组件Master 组件Kube-apiserverKube-controller-managerKube-scheduler配置存储中心 etcd Node 组件KubeletKube-Proxydocker 或 rocket Kubernetes 核心概念PodPod控制器La…...
策略模式——算法的封装与切换
1、简介 1.1、概述 在软件开发中,常常会遇到这种情况,实现某一个功能有多条途径。每一条途径对应一种算法,此时可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。为了适应算法灵活性而产生的设计模…...
c++转换构造,拷贝构造,operator=
c转换构造,拷贝构造,operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理,这里其实是发生了隐式类型转…...
支付宝蜻蜓设备abs调试
蜻蜓设备系统日志调试 1、蜻蜓设备进入开发者模式 长按关键键直到屏幕上出现设置按钮,点击设置按钮,选择关于本机,找到系统版本,连续点击8次,选择进入调试模式 2、找到小程序容器,连续点击8次࿰…...
论memset的时间代价
论memset的时间代价 众所周知,memset是一个常用的数组赋值方式,几乎每个OI player全都使用过,但是这个函数从来不要脸,也不给你脸。 大家耳顺能详的几个例子: ①memset(a,0,sizeof(a));把a全赋值成0。 ②memset(a,…...
linux下绑定进程到指定CPU的操作方法
taskset简介 # taskset Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on ex…...
springboot+maven插件调用mybatis generator自动生成对应的mybatis.xml文件和java类
mybatis最繁琐的事就是sql语句和实体类,sql语句写在java文件里很难看,字段多的表一开始写感觉阻力很大,没有耐心,自动生成便成了最称心的做法。自动生成xml文件,dao接口,实体类,虽一直感觉不太优…...
C# 根据前台传入实体名称,动态查询数据
前言: 项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例…...
Netty入门学习
目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架…...
代客泊车对HUT功能交互规范
目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统(环视和超声波雷达)...…...
mysql的update_time
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下: DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...
避免安装这5种软件,手机广告频繁弹窗且性能下降
在我们使用手机的日常生活中,选择合适的应用软件对于保持良好的使用体验至关重要。然而,有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序,我们应该尽量避免安装它们。 首先第一种…...
kafka-事务
1. 事务的5个API // 1初始化事务 void initTransactions();// 2开启事务 void beginTransaction() throws ProducerFencedException;// 3在事务内提交已经消费的偏移量(主要用于消费者) void sendOffsetsToTransaction(Map<TopicPartition, OffsetAn…...
【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)
阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程,但是我没在界面看到有vnc连接,后面才发现官网有教程。 其实官网很详细了,不过这里还是…...
Python 扩展 快捷贴士:os模块下的创建目录的方式
Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建多层目录。 如果子目录创建失败或者已经存在,会抛出一个 OSError 的异常,Windows上Error 183 即为目录已经存在的异常错误。 如果第一个参数 path 只有一级,即只创建一层目…...
Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 介绍 恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积…...
redis缓存雪崩和缓存击穿
目录 缓存雪崩 解决方案: 缓存击穿 解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决方案: u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …...
北京交通大学 | 基于TD3算法的层叠超表面辅助多用户MISO系统联合优化研究
引言随着无线通信技术的不断发展,可重构智能表面(RIS)技术因其低功耗和信号操控能力而受到广泛关注。然而,RIS的单层结构和离散相移能力限制了其性能表现。层叠智能超表面(SIM)作为一项创新技术,…...
Linux内核设计哲学:你我承载力的艺术(续)
第七部:设备驱动——与不完美的世界和解7.1 你不是主人,你是仆人设备驱动是内核中最“卑微”的组件。它不和用户直接打交道,不参与核心决策,甚至不拥有任何资源。它只是硬件的翻译官——把内核的标准请求翻译成硬件能懂的指令&…...
用 AI 做鸿蒙游戏 NPC,是一种什么体验?
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
高校科研如何提升成果产业化能力?
观点作者:科易网-国家科技成果转化(厦门)示范基地高校科研作为科技创新的核心源头,近年来在基础研究、核心技术突破等方面取得了显著进展。然而,如何将实验室里的“论文成果”有效转化为产业界的“经济产出”ÿ…...
Unity/Godot开发者看过来:手把手教你将Spine动画导出并集成到游戏引擎里(附常见报错解决)
Unity/Godot开发者实战指南:Spine动画工程化集成全流程解析 当你在Spine中完成了一个令人满意的角色动画后,接下来面临的真正挑战是如何让它活灵活现地跑在游戏引擎里。作为经历过无数次Spine动画集成的老手,我深知这个过程中可能遇到的种种…...
GOERTEK SPL06-001 LGA-8 压力传感器
关键特性 压力范围:300...1100hPa(99000米...-500米,相对于海平面) 温度范围:-40...85C 供电电压:1.7.. 3.6V (VDD) ,1.2... 3.6V (VDDIO)封装:带金属盖的LGA封装 小尺寸:2.5mmx2.0mm;超薄:0.95mm高度 相对精度:0.06hPa,相当于0.5米 绝对精度:典型值1hPa…...
彻底卸载Windows 10 OneDrive:开源脚本的完整解决方案
彻底卸载Windows 10 OneDrive:开源脚本的完整解决方案 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 你是否曾为Windows 10内置的…...
一站式B站直播录制解决方案:零基础掌握BililiveRecorder高效使用指南
一站式B站直播录制解决方案:零基础掌握BililiveRecorder高效使用指南 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder 在数字内容爆炸的时代,如何永久保存喜爱的…...
新手零门槛部署openclaw:快马ai生成手把手配置教程与验证代码
最近在尝试部署openclaw这个开源爬虫框架时,发现网上资料比较零散,对新手不太友好。经过一番摸索,我总结了一套适合零基础同学的部署方案,整个过程在InsCode(快马)平台上测试通过,特别适合想快速上手的朋友。 硬件和系…...
TypeVar
## 关于Python里的TypeVar,你可能想知道的 最近在整理一些旧代码,翻到几年前写的一个通用缓存工具类,里面用到了TypeVar。当时注释里只简单写了一句“用于类型提示”,现在回头看,觉得可以展开聊聊这个东西。 TypeVar是…...
