/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */
#define    false    0
#define     true    1

int isPail(struct ListNode* head ) {
    
    // write code here
    struct ListNode* s = head;
    struct ListNode* p = head;
    struct ListNode* q = head;
    struct ListNode* slow = head;
    struct ListNode* save = head;
    struct ListNode* cur = head;
    int ListLength = 0;
    int q_count = 1;
    int p_count = 0;
    
    /*head == NULL*/
    if(head == NULL)
        return false;
    
    if(head ->next == NULL)
        return true;
    /*
    1. 将1/2 length之后的链表节点进行反转
    2. 进行回文判断
    */
    
    while(s != NULL){
        ListLength++;
        s = s->next;
    }
    
    while(q_count < ListLength/2){
        q_count++;
        slow = slow->next;
    }
    
    q = slow->next;
    cur = slow->next;
    /*反转q之后的链表节点*/
    while(q != NULL){
        save = q->next;
        q->next = cur;
        cur = q;    
        q = save;
    }
    
    /* cur 指向最有一个链表节点
    *使p 指向cur
    */
    q = cur;
    p = head;
    
    /*判断是否为回文链表*/
    for( ; p != q->next && q != p->next; p = p->next, q = q->next){
        if(p->val != q->val){
        return false;
        }
    }
    
return true;
}