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

LeetCode - 234. 回文链表

目录

题目

快慢双指针步骤

读者可能的错误写法

正确的写法


题目

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

快慢双指针步骤

找到链表的中点(find_mid函数):

  • 使用快慢指针,慢指针每次走一步,快指针每次走两步
  • 当快指针到达末尾时,慢指针指向中点

反转链表后半部分(reserve函数):

  • 从中点开始,将后半部分链表反转
  • 返回反转后的链表头(原链表的尾部)

比较前半部分和反转后的后半部分:

  • 从原链表头和反转后的链表头同时开始遍历
  • 逐个比较对应节点的值
  • 如果任何一对值不相等,则不是回文
  • 如果全部比较完毕都相等,则是回文

注意事项:

  • 对于奇数长度链表,中点会被包含在后半部分
  • 比较时需要同时检查两个指针是否为空,避免空指针访问
  • 理想情况下,比较完成后应该将链表还原(题目中没有实现)

读者可能的错误写法

class Solution {
public:ListNode* find_mid(ListNode* head){ListNode* slow = head;ListNode* fast = head;while(fast){slow = slow->next;fast = fast->next->next;}return slow;}ListNode* reserve(ListNode* head){ListNode* phead = head;ListNode* newhead = nullptr;while(phead){ListNode* temp = phead->next;phead->next = newhead;newhead = phead;phead = temp;}return newhead;}bool isPalindrome(ListNode* head) {ListNode* mid = find_mid(ListNode* head);ListNode* res = reserve(ListNode* head);while(res){if(mid->val != res->val){return false;}mid = mid->next;res = res->next;}return true;}
};

你的代码有几个错误:

在调用函数时不应该再次声明参数类型:

   // 错误ListNode* mid = find_mid(ListNode* head);// 正确ListNode* mid = find_mid(head);

find_mid 函数中的 fast 指针移动逻辑有问题,可能会导致空指针异常:

   // 错误while(fast){slow = slow->next;fast = fast->next->next; // 如果fast->next为空,这里会崩溃}// 正确while(fast && fast->next){slow = slow->next;fast = fast->next->next;}

在 isPalindrome 函数中,你反转了整个链表,这会改变原始链表结构。正确的做法是只反转后半部分链表:

   // 错误ListNode* res = reserve(ListNode* head);// 正确ListNode* res = reserve(mid);

你在比较时使用了 mid 和 res,但应该比较的是原链表的前半部分和反转后的后半部分:

   // 错误while(res){if(mid->val != res->val)// 正确ListNode* curr = head;while(res){if(curr->val != res->val)

正确的写法

class Solution {
public:ListNode* find_mid(ListNode* head){ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}ListNode* reserve(ListNode* head){ListNode *phead = head;ListNode* tail = nullptr;while(phead){ListNode* tmp = phead->next;phead->next = tail;tail = phead;phead = tmp;}return tail;}bool isPalindrome(ListNode* head) {ListNode* mid = find_mid(head);ListNode* res = reserve(mid);ListNode* cur = head;while(res){if(cur->val != res->val){return false;}cur = cur->next;res = res->next;}return true;}
};
http://www.xdnf.cn/news/758467.html

相关文章:

  • Roller: 抽奖系统测试的幕后剧本-测试报告
  • Spring AI Image Model、TTS,RAG
  • PINN模型相关原理
  • 【CBAP50技术手册】#32 Organizational Modelling(组织建模):BA(业务分析师)的“变革导航图”
  • 安卓jetpack compose学习笔记-UI基础学习
  • 机电的焊接技术
  • 《中国棒垒球》注册青少年运动员需要什么条件·棒球1号位
  • 【Go-6】数据结构与集合
  • [网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)
  • Spring Boot,注解,@ComponentScan
  • linux驱动开发(1)-内核模块
  • rl_sar功能包详解
  • pyqt5笔记20250601
  • gitflow
  • 《Pytorch深度学习实践》ch2-梯度下降算法
  • 设计模式——状态设计模式(行为型)
  • 设计模式——代理设计模式(结构型)
  • android stdio 的布局属性
  • 鸿蒙ArkTS | Badge 信息标记组件自学指南
  • MyBatis03——SpringBoot整合MyBatis
  • Kubernetes(K8s)核心架构解析与实用命令大全
  • Go 语言 select 语句详解
  • JMeter 性能测试
  • DDR5 ECC详细原理介绍与基于协议讲解
  • 3D Gaussian splatting 05: 代码阅读-训练整体流程
  • 【计算机网络】第3章:传输层—面向连接的传输:TCP
  • Spring Boot中Excel处理完全指南:从基础到高级实践
  • telnet 基本用法
  • Java并发编程中任务调度与线程池的配置优化
  • 大规模真实场景 WiFi 感知基准数据集