LeetCode热题100 回文链表

题目描述

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:


输入: head = [1,2,2,1]
输出: true

示例 2:


输入: head = [1,2]
输出: false

提示:

链表中节点数目在范围[1,105]内链表中节点数目在范围[1, 10^5] 内链表中节点数目在范围[1,105]内
0<=Node.val<=90 <= Node.val <= 90<=Node.val<=9

思路

1 使用快慢指针 获取中心位置。

2 将其中一部分进行翻转后进行一一对比。

代码

cpp 复制代码
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == nullptr || head->next == nullptr) return true;

        // 1 获取第一部分尾部
        ListNode *firstHalfEnd = endOfFirstHalf(head);
        // 2 将第二部分进行翻转
        ListNode *secondHalfStart = reverseList(firstHalfEnd->next);
        // 3 对比是否相等
        ListNode *p1 = head;
        ListNode *p2 = secondHalfStart;
        bool res = true;
        while(p2 != nullptr)
        {
            if(p1->val != p2->val)
            {
                res = false;
                break;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        // 4 翻转回去复原
        firstHalfEnd->next = reverseList(secondHalfStart);
        return res;
    }
    //  快慢指针获取中间部分 (n+1)/2
    ListNode *endOfFirstHalf(ListNode *head)
    {
        ListNode *fast = head;
        ListNode *slow = head;
        while(fast->next != nullptr && fast->next->next != nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }
    // 对链表进行翻转
    ListNode* reverseList(ListNode* head) 
    {
        ListNode * tail = nullptr;
        ListNode * cur = nullptr;
        while(head != nullptr)
        {
            // 保存下一个位置
            ListNode * cur = head->next;
            // 修改当前位置的指向
            head->next = tail;
            tail = head;
            // 获取下一个位置
            head = cur;
        }
        return tail;
    }
};
相关推荐
6Hzlia37 分钟前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表
隔壁大炮44 分钟前
Day07-RNN介绍
人工智能·pytorch·rnn·深度学习·神经网络·算法·numpy
WL_Aurora1 小时前
Python 算法基础篇之什么是算法
python·算法
墨染天姬1 小时前
[AI]DeepSeek-R1的GRPO算法
人工智能·算法·php
D_C_tyu1 小时前
JavaScript | 数独游戏核心算法实现
javascript·算法·游戏
qiqsevenqiqiqiqi1 小时前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
码之气三段.1 小时前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法
AI科技星2 小时前
ELN 升级:π 级数自动生成器全域数理架构
大数据·人工智能·python·算法·金融
强盛机器学习~2 小时前
2026年SCI一区新算法-傅里叶变换优化算法(FTO)-公式原理详解与性能测评 Matlab代码免费获取
算法·matlab·进化计算·群体智能·傅里叶变换·元启发式算法