快慢指针找到中间节点,以中间节点为界将后半部分翻转,将翻转后的那一半链表与前一半链表做回文比较。

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    bool isPail(ListNode* head) {
        // write code here
        if(head == nullptr || head->next == nullptr) return true;
        ListNode *fast = head, *mid = head;
        while (fast && fast->next) {  // 找到中间节点
            fast = fast->next->next;
            mid = mid->next;
        }
        fast = mid->next;
        mid->next = nullptr;
        ListNode *end = nullptr;
        // 进行后半部分翻转
        while(fast) {
            end = fast->next;
            fast->next = mid;
            mid = fast;
            fast = end;
        }
        //判断回文
        end = mid;
        while (head && end) {
            if (head->val != end->val) {
                return false;
            }
            head = head->next;
            end = end->next;
        }
        return true;
    }
};