class PalindromeList {
public:
    ListNode* reverse(ListNode *A){
        if(A->next == nullptr){
            return A;
        }
        ListNode * fastP = A -> next;
        ListNode * slowP = A;
        while(fastP->next != nullptr){
            ListNode *fastNext = fastP->next;
            fastP->next =slowP;
            slowP = fastP;
            fastP = fastNext;
        }
        A ->next =nullptr;
        return fastP;
    }
    bool chkPalindrome(ListNode* A) {
        // write code here
        if(A->next == nullptr){
            return false;
        }
        if(A->next->next ==nullptr ){
            if(A->val == A->next->val){
                return true;
            }
            return false;
        }
        ListNode * begin = A;
        ListNode * fastP = A;
        ListNode * slowP = A;
        while(fastP->next!= nullptr && fastP->next->next != nullptr  ){
            fastP = fastP->next->next;
            slowP = slowP->next;
        }
        
            slowP = slowP -> next; //奇数 偶数都需要处理
        
        ListNode* reverseList = reverse(slowP);
        while(reverseList != nullptr && begin !=nullptr){
            if(reverseList -> val != begin ->val){
                return false;
            }
            reverseList = reverseList->next;
            begin =begin->next;
        }
        return true;
    }
};