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;
    }
};
相关推荐
北极有牛1 分钟前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记1 分钟前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序22 分钟前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室23 分钟前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
圣保罗的大教堂1 小时前
leetcode 301. 删除无效的括号 困难
leetcode
liliangcsdn1 小时前
派息率指标的应用探索和分析
大数据·算法
垆边人似月.2 小时前
华为机试题 :两数之和
c++·算法·华为
默默开发2 小时前
物流行业可用算法方向
算法
垆边人似月.2 小时前
华为机试题 :有效的括号
c++·算法·华为
A加ITIL教练长河achotsao2 小时前
ITIL Master 战略领导者课后系列分享:AI编程正在重新划分研发与运维的边界
算法