/**
* 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);
}