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

/**
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */

//增加结点
struct ListNode* BuyNode(int x)
{
    struct ListNode*newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
    newnode->val=x;
    newnode->next=NULL;

    return newnode;
}

struct ListNode* CopyList(struct ListNode* plist)
{
    struct ListNode* cur=plist;
    struct ListNode* copy1=BuyNode(0);
    struct ListNode* head2=copy1;
    while(cur != NULL)
    {
        struct ListNode* copy=BuyNode(cur->val);
        cur=cur->next;
        copy1->next=copy;
        copy1=copy1->next;
    }

    return head2->next;
}

//反转链表
struct ListNode* ExchangeList(struct ListNode* plist)
{
    struct ListNode* pre=NULL;
    struct ListNode* cur=plist;
    while(cur != NULL)
    {
        struct ListNode* tmp=cur->next;
        cur->next=pre;
        pre=cur;
        cur=tmp;
    }

    return pre;
}

bool isPail(struct ListNode* head )
{
    //判断链表中元素的个数
    struct ListNode* cur=head;
    int size=0;
    while(cur != NULL)
    {
        size++;
        cur=cur->next;
    }
    //判断是否为空或只有一个
    if(head == NULL || size==1)
    {
        return head;
    }
    //将链表head拷贝到tmp
    struct ListNode* head2=CopyList(head);
    //反转链表
    struct ListNode* head3=ExchangeList(head);
    //比较
    while(head3 && head2)
    {
        if(head3->val != head2->val)
        {
            return false;
        }
        head3=head3->next;
        head2=head2->next;
    }

    return true;
}