思路:

  1. 定义两个指针,一个快指针 fast 和一个慢指针 slow,用来找到链表的中间节点。

  2. 从中间节点开始,将后面的链表反转。

  3. 然后再将前半部分和后半部分的链表逐一比较,判断是否为回文链表。

  4. 最后将后半部分的链表再次反转,恢复原来的链表。

代码实现:

bool isPalindrome(ListNode* head) {
    if (head == nullptr || head->next == nullptr) {
        return true;
    }
    ListNode* fast = head;
    ListNode* slow = head;
    // 找到链表的中间节点
    while (fast->next != nullptr && fast->next->next != nullptr) {
        fast = fast->next->next;
        slow = slow->next;
    }
    // 反转后半部分的链表
    ListNode* pre = nullptr;
    ListNode* cur = slow->next;
    while (cur != nullptr) {
        ListNode* temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    // 逐一比较前半部分和后半部分的链表
    ListNode* p1 = head;
    ListNode* p2 = pre;
    bool res = true;
    while (res && p2 != nullptr) {
        if (p1->val != p2->val) {
            res = false;
        }
        p1 = p1->next;
        p2 = p2->next;
    }
    // 恢复后半部分的链表
    cur = pre;
    pre = nullptr;
    while (cur != nullptr) {
        ListNode* temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    slow->next = pre;
    return res;
}

原文地址: https://www.cveoy.top/t/topic/bbMS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录