/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    bool isPail(ListNode* head) {
        // write code here
            if(head==NULL||head->next==NULL){
                    return 1;//空和单节点提前判断
            }
        //拷贝链表
        ListNode*reverse_prehead=new ListNode(0);
        ListNode*rep=reverse_prehead;
        ListNode*p=head;
        while(p!=NULL){
            ListNode*newnode=new ListNode(p->val);
            rep->next=newnode;
            rep=newnode;
            p=p->next;
        }
         ListNode*reverse_head=reverse_prehead->next;
        //反转
        ListNode*pre=reverse_prehead;
        ListNode*cur=reverse_head;
        ListNode*after=reverse_head->next;
       
        while(cur!=NULL){
            cur->next=pre;
            pre=cur;
            cur=after;
            after=after->next;
        }
        delete reverse_prehead;
        reverse_head->next=NULL;
        ListNode*rehead=pre;
      //比较原链表和翻转链表
        ListNode*pb=rehead;
        for(ListNode*pa=head;pa!=NULL;pa=pa->next){
             if(pa->val!=pb->val){
                return 0;
             }
             else{
                   pb=pb->next;
             }
        }
           return 1;
        

      
       

    }
};