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

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.lryc.cn/news/2398549.html

相关文章:

  • PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构
  • nginx+tomcat动静分离、负载均衡
  • SQL进阶之旅 Day 13:CTE与递归查询技术
  • 【PmHub面试篇】Gateway全局过滤器统计接口调用耗时面试要点解析
  • neo4j 5.19.0两种基于向量进行相似度查询的方式
  • 项目课题——基于ESP32的智能插座
  • 华为云Flexus+DeepSeek征文|利用华为云 Flexus 云服务一键部署 Dify 平台开发文本转语音助手全流程实践
  • ck-editor5的研究 (7):自定义配置 CKeditor5 的 toolbar 工具栏
  • MPLS-EVPN笔记详述
  • 嵌入式Linux系统中的启动分区架构
  • 无人机甲烷检测技术革新:开启环境与能源安全监测新时代
  • mysql数据库实现分库分表,读写分离中间件sharding-sphere
  • [Python] struct.unpack() 用法详解
  • 普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
  • Spring AOP:面向切面编程 详解代理模式
  • 零知开源——STM32F407VET6驱动ILI9486 TFT显示屏 实现Flappy Bird游戏教程
  • 数据安全中心是什么?如何做好数据安全管理?
  • Monorepo 详解:现代前端工程的架构革命
  • 16-前端Web实战(Tlias案例-部门管理)
  • 电路学习(二)之电容
  • 从“remote rejected”看git角色区别,Maintainer和Devoloper
  • CTA-861-G-2017中文pdf版
  • JavaScript中的常量值与引用值:从基础到实践
  • 港大NVMIT开源Fast-dLLM:无需重新训练模型,直接提升扩散语言模型的推理效率
  • ESP32-C3 Vscode+ESP-IDF开发环境搭建 保姆级教程
  • SCSS 全面深度解析
  • 解决vscode打开一个单片机工程文件(IAR/keil MDK)因无法找到头文件导致的结构体成员不自动补全问题。
  • Python 在金融中的应用- Part 1
  • 【Node.js 深度解析】npm install 遭遇:npm ERR! code CERT_HAS_EXPIRED 错误的终极解决方案
  • Vue内置组件Teleport和Suspense