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 小时前
Leetcode 054螺旋矩阵 采用方向数组解决
算法·leetcode·矩阵
big_rabbit05023 小时前
[算法][力扣101]对称二叉树
数据结构·算法·leetcode
WolfGang0073213 小时前
代码随想录算法训练营 Day11 | 二叉树 part01
数据结构
美好的事情能不能发生在我身上3 小时前
Hot100中的:贪心专题
java·数据结构·算法
2301_821700533 小时前
C++编译期多态实现
开发语言·c++·算法
xixihaha13244 小时前
C++与FPGA协同设计
开发语言·c++·算法
小小怪7504 小时前
C++中的函数式编程
开发语言·c++·算法
xixixiLucky4 小时前
编程入门算法题---小明爬楼梯求爬n层台阶一共多少种方法
算法
剑锋所指,所向披靡!4 小时前
数据结构之线性表
数据结构·算法
m0_672703316 小时前
上机练习第49天
数据结构·算法