/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */
bool isPail(struct ListNode* head ) {
    // write code here
    typedef struct ListNode Node;
    Node* fast=head;
    Node* slow=head;
    Node* next=NULL;
    if(head==NULL||head->next==NULL){
        return true;
    }
    while(fast&&fast->next){
        fast=fast->next->next;
        slow=slow->next;
    }//使slow到达链表的中部
    fast=slow->next;//fast达到中部靠后的节点
    slow->next=NULL;//使后半边的链表独立出来
    while(fast){
        next=fast->next;
        fast->next=slow;
        slow=fast;
        fast=next;
    }//翻转后半边的链表
    fast=head;//使fast回到链表的开头节点
    while(slow&&fast){
        if(slow->val!=fast->val){
            return false;
        }
        fast=fast->next;
        slow=slow->next;
    }//检验是否为回文序列
    return true;
}