/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 the head * @return bool布尔型 */ typedef struct ListNode* LinkList; //统计链表元素节点个数 int NumCount(LinkList L); //翻转链表 LinkList reverseList(LinkList head); LinkList reverse(LinkList pre,LinkList cru); bool isPail(struct ListNode* head ) { // write code here bool flag; if(head==NULL||head->next==NULL) return flag=true; int num=NumCount(head); int i; LinkList h,s; s=head; //找到中值节点,并分离成两个链表 for(i=1;i<(num/2);i++) s=s->next; h=s->next; s->next=NULL; //将后半部分链表翻转,进行判断 h=reverseList(h); LinkList s1,s2; s1=head; s2=h; while(s1&&s2){ if(s1->val!=s2->val) return flag=false; s1=s1->next; s2=s2->next; } return flag=true; } int NumCount(LinkList L){ LinkList s; s=L; int cot=0; while(s){ s=s->next; cot++; } return cot; } LinkList reverseList(LinkList head){ if(head==NULL||head->next==NULL) return head; head=reverse(NULL,head); return head; } LinkList reverse(LinkList pre,LinkList cru){ if(cru==NULL) return pre; LinkList temp; temp=cru->next; cru->next=pre; return reverse(cru,temp); }