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

02.06、回文链表

02.06、[简单] 回文链表

1、题目描述

编写一个函数,检查输入的链表是否是回文的。

2、解题思路:

  1. 快慢指针找中点:
    • 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步,而快指针 fast 每次移动两步。这样,当快指针到达链表末尾时,慢指针恰好位于链表中间。
  2. 反转后半部分链表:
    • 在找到中间节点后,将链表的后半部分反转。我们从 slow->next 开始反转链表,最终 newhead 将指向反转后的后半部分链表的头节点。
  3. 对比前半部分和后半部分:
    • 反转链表的后半部分后,将它与前半部分进行比较。如果所有节点值相等,则说明链表是回文的。
  4. 返回结果:
    • 如果比较过程中发现不一致,则返回 false。如果全部节点相等,则返回 true

3、代码实现与详细注释

class Solution {
public:bool isPalindrome(ListNode* head) {// 如果链表为空或只有一个节点,直接返回 trueif (head == nullptr || head->next == nullptr) {return true;}// 使用快慢指针找到链表的中间节点ListNode* fast = head;ListNode* slow = head;while (fast->next && fast->next->next) {slow = slow->next;  // 慢指针每次移动一步fast = fast->next->next;  // 快指针每次移动两步}// 将链表的后半部分反转ListNode* newhead = slow->next;  // newhead 指向后半部分的开始节点ListNode* prev = nullptr;  // 用于反转链表while (newhead->next) {ListNode* next = newhead->next;  // 保存下一个节点newhead->next = prev;  // 当前节点的 next 指向前一个节点prev = newhead;  // prev 指向当前节点,逐步推进newhead = next;  // newhead 移动到下一个节点}newhead->next = prev;  // 最后一个节点反转后,形成新的链表// 对比前半部分和反转后的后半部分是否相同slow = head;  // slow 回到链表头部while (newhead) {  // 遍历反转后的链表if (newhead->val != slow->val) {  // 如果值不相等,返回 falsereturn false;}slow = slow->next;  // 两个指针同时移动newhead = newhead->next;}// 如果链表前后部分相同,则返回 truereturn true;}
};

4、时间复杂度和空间复杂度:

  • 时间复杂度: O(n),其中 n 是链表的长度。我们遍历链表两次,一次是找到中点,另一次是进行比较。
  • 空间复杂度: O(1),因为只使用了常数额外空间。

这个方法通过快慢指针和链表反转的技巧,避免了额外的空间开销,是一个比较高效的解决方案。

http://www.xdnf.cn/news/2668.html

相关文章:

  • C# wpf
  • mysql community 8.0.23升级到8.0.42再到8.4.5
  • 架构师与高级工程师:职业差异与进阶之路
  • C++ —— 正向迭代器与反向迭代器
  • 5000元可以运行32B大模型的笔记本
  • Shell脚本-嵌套循环应用案例
  • vue mixin混入与hook
  • 如何使用可视化工具分析 JVM 的性能瓶颈?
  • Spring Security授权管理
  • 综合练习一
  • JAVA基础:Collections 工具类实战指南-从排序到线程安全
  • ViTa-Zero:零样本视觉触觉目标 6D 姿态估计
  • Ubuntu深度学习革命:NVIDIA-Docker终极指南与创新实践
  • LLVIP、KAIST、M3FD数据集
  • GD32F407单片机开发入门(十六)单片机IAP(在应用编程)详解及实战源码
  • 消息队列优化指南:处理堆积与保障消息可靠性
  • 喜马拉雅卖身腾讯音乐:在线音频独立时代的终结
  • Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车
  • codeforces C. The Trail
  • 【Nginx】 使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上demo
  • 【AI生产力工具】Windsurf,一款AI编程工具
  • 华纳云:centos如何实现JSP页面的动态加载
  • 模板方法模式(Template Method Pattern)
  • 数据库对象概述
  • Java项目与技术栈场景题深度解析
  • C语言(5)—操作符详解
  • leetcode 143. 重排链表
  • js day8
  • Java学习手册: IoC 容器与依赖注入
  • leetcode刷题日记——两数相加