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;
    }
};
相关推荐
地平线开发者2 小时前
【地平线 征程 6 工具链进阶教程】算子优化方案集锦
算法·自动驾驶
多恩Stone2 小时前
【3D-AICG 系列-14】Trellis 2 的 Texturing Pipeline 保留单层薄壳,而 Textured GLB 会变成双层
人工智能·python·算法·3d·aigc
Solitary-walk2 小时前
前缀和思想
数据结构·c++·算法
智驱力人工智能2 小时前
机场鸟类活动智能监测 守护航空安全的精准工程实践 飞鸟检测 机场鸟击预防AI预警系统方案 机场停机坪鸟类干扰实时监测机场航站楼鸟击预警
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
量子物理学2 小时前
三、C#高级进阶语法——特性(Attribute)
java·算法·c#
忍者必须死2 小时前
JDK1.7的HashMap的环形链表
java·数据结构·算法·链表
NEXT062 小时前
数组转树与树转数组
前端·数据结构·面试
仟濹2 小时前
【算法打卡day10(2026-02-24 周二)动态规划DP基础理论】
算法·动态规划
xiaoccii2 小时前
C++(入门版)
java·c++·算法