普通循环的方式总是运行太慢,只要由两层循环就不得行。
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(struct ListNode* head ) {
// write code here
struct ListNode* pfast; //快指针
struct ListNode* pslow;//慢指针
struct ListNode* pnex;//后面一个指针
pfast = head;
pslow = head;
pnex = NULL;
if(head==NULL || head->next==NULL)
{
return true;
}
while(pfast!=NULL && pfast->next!=NULL)
{
pfast = pfast->next->next;
pslow = pslow->next;
}
pfast = pslow->next;
pslow->next=NULL;
while(pfast!=NULL)
{
pnex = pfast->next;
pfast->next = pslow;
pslow = pfast;
pfast = pnex;
}
pfast = head;
while(pslow!=NULL && pfast!=NULL)
{
if(pslow->val!=pfast->val)
{
return false;
}
pfast = pfast->next;
pslow = pslow->next;
}
return true;
//只要循环n/2次
// for(int i=0;i<(n/2);i++)
// {
// j = 0;
// while(j<(n-i-1))
// {
// p2 = p2->next;
// j++;
// }
// if(p1->val == p2->val)
// {
// p1 = p1->next;
// p2 = head;
// }
// else
// {
// return false;
// }
// }
}