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

LeetCode - 234. 回文链表

问题

234. 回文链表 - 力扣(LeetCode)

思路

首先,我需要找到链表的中点,这里使用快慢指针技巧 - slow指针每次走一步,fast指针每次走两步。当fast到达链表尾部时,slow就正好在中间位置。

然后关键的一步是处理链表长度的奇偶性:

  • 如果fast不为空,说明链表长度是奇数,这时中间节点不应该参与比较,所以我从slow的下一个节点开始反转
  • 如果fast为空,说明链表长度是偶数,直接从slow开始反转后半部分

接着我用递归方式反转后半部分链表 - 递归到链表末尾,然后在回溯过程中重新连接指针,把方向反过来。

最后,比较原链表前半部分与反转后的后半部分,如果它们对应位置的值都相同,那么这就是一个回文链表。

这个算法的时间复杂度是O(n),我们只需要遍历链表常数次。空间复杂度主要来自递归调用栈,是O(n/2),也就是O(n)

读者可能出现的错误写法

class Solution {
public:bool isPalindrome(ListNode* head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}ListNode newlist = reserve(slow->next);bool result = compare(head,newlist);return result;}ListNode* reserve(ListNode* head){if(!head || !head->next){return head;}ListNode* newHead = reserve(head->next);head->next->next = head;head->next = nullptr;return newHead;}bool compare(ListNode* head1,ListNode* head2){while(head1&&head2){if(head1->val == head2->val){head1 = head1->next;head2 = head2->next;}else{return false;}}return true;}
}; 

这个方法有一个问题,对于奇数长度的链表会出错。

问题在于:当链表长度为奇数时,中间节点不应该参与比较。但你的代码中,直接反转了从中点开始的所有节点,导致前半部分比后半部分多出节点。也就是说,当快慢指针走完之后,需要进行判断是否是奇数,如果是奇数就直接跳过slow->next,如果不是奇数就使用slow

正确写法

class Solution {
public:bool isPalindrome(ListNode* head) {ListNode* slow = head;ListNode* fast = head;ListNode* newlist = nullptr;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}if(fast){newlist = reserve(slow->next);}else{newlist = reserve(slow);}bool result = compare(head,newlist);return result;}ListNode* reserve(ListNode* head){if(!head || !head->next){return head;}ListNode* newHead = reserve(head->next);head->next->next = head;head->next = nullptr;return newHead;}bool compare(ListNode* head1,ListNode* head2){while(head1 && head2){if(head1->val == head2->val){head1 = head1->next;head2 = head2->next;}else{return false;}}return true;}
};
http://www.dtcms.com/a/358732.html

相关文章:

  • 2025年高性能计算年会
  • Golang 面试题「高级」
  • 零碳智慧园区双碳方案
  • 代理IP网站哪家好?全球优质IP代理服务商有什么推荐?
  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Linux查看Java进程PID、端口号和内存占用脚本
  • 2023年山东省信息学小学组(CSP-X)第一轮题解
  • 【嵌入式原理系列-第六篇】从Flash到RAM:MCU ld脚本全解析
  • SUMO 与 孪易 IOC 协同:开启交通数字孪生新纪元
  • 哪些人需要考道路运输安全员证?政策要求与适用范围
  • 计算机网络面试集合
  • 通过jar -jar启动jar包的yml配置logback 指定log目录
  • 2025-08-18面试题关于公司
  • 【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要
  • Git 远程仓库操作:推送到远程仓库、拉取远程仓库到本地仓库
  • C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region
  • AV1编码资源可用性模式
  • DC-HRNet
  • SQL学习记录
  • 键查跑分、比配置的手机性能排行
  • ThingsBoard使用Vue3实现
  • nacos 2.5.1 心跳源码解析
  • MCP进阶指南:如何挑选最适合你的AI助手“装备“
  • 计算机毕业设计 java 在线学习系统 基于 Java 的在线教育平台 Java 开发的学习管理系统
  • Fourier 级数展开(案例:级数展开 AND 求和)
  • 仓颉编程语言青少年基础教程:程序基本结构和语言特点
  • Day31 进程间通信(IPC)多线程目录扫描
  • mysql(自写)
  • 谈物质的运动与运动的物质
  • 基于立创・庐山派 K230CanMV 开发板的视觉引导舵机追踪系统技术分析