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

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) {
        // 如果链表为空或只有一个节点,直接返回 true
        if (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) {  // 如果值不相等,返回 false
                return false;
            }
            slow = slow->next;  // 两个指针同时移动
            newhead = newhead->next;
        }

        // 如果链表前后部分相同,则返回 true
        return true;
    }
};

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

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

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

相关文章:

  • 《深入浅出数据索引》- 公司内部培训课程笔记
  • 【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)
  • 【2025年28期免费获取股票数据API接口】实例演示五种主流语言获取股票行情api接口之沪深A股强势股池数据获取实例演示及接口API说明文档
  • 面试java做了一道逻辑题,人麻了
  • 你使用过哪些 Java 并发工具类?
  • 《人月神话》:软件工程的成本寓言与生存法则
  • 自动解单色数织程序(基于Python和Ortools)
  • 无人机的飞行路径规划之CH-PPO算法(思考)
  • 面试之《vue常见考题》
  • MySQL环境安装详细教程(Windows/macOS/Linux)
  • Spring 的三种注入方式?
  • 代码随想录刷题day42|(二叉树篇)二叉树的最小深度(递归)+完全二叉树结点个数
  • Java反射与动态代理:框架设计的基石
  • Spring WebFlux:响应式编程
  • 文字转语音chat-tts-ui
  • 分布式锁—Redisson的同步器组件
  • MySQL中 IN 到底走不走索引?
  • win10安装部署DB-gpt,坑多
  • mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境
  • 20天 - TCP 和 UDP 有什么区别?说说 TCP 的三次握手?TCP 是用来解决什么问题?
  • 4年间职务侵占、受贿逾亿元,北京高院:严惩民企内部腐败
  • 证监会副主席李明:支持符合条件的外资机构申请新业务、设立新产品
  • 周国辉谈花开岭现象 :年轻的公益人正在用行动点亮希望
  • 中国证监会副主席李明:目前A股估值水平仍处于相对低位
  • “大国重器”、新型反隐身雷达……世界雷达展全面展示尖端装备
  • 15年全免费,内蒙古准格尔旗实现幼儿园到高中0学费