使用快慢指针解决判段链表回文问题
使用快慢指针能精准定位到表中的几分之几;指针
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ bool isPalindrome(struct ListNode* head){ if(head==0) return true; struct ListNode* slow_p=head,* p=head; //找到链表的中间节点。 while(p->next!=NULL&&p->next->next!=NULL){ //走两步与走一步之差为中点; slow_p=slow_p->next; p=p->next->next; } //当以p->next=NULL 结尾是为奇数 // 当以p->next->next=NULL结尾时为偶数; //将链表分红两半。其中if语句处理链表长度为奇数的状况。 struct ListNode* head_=slow_p->next; //重定义头; //奇数时p->next==NULL; if(p->next==NULL){ head_=malloc(sizeof(struct ListNode)); head_->val=slow_p->val; head_->next=slow_p->next; } slow_p->next=0; //将第二个链表反转; p=head_; while(p->next!=0){ slow_p=head_; head_=p->next; //将头日后移动; p->next=p->next->next;//先删除 head_->next=slow_p; //尾插法; } //按顺序比较两链表val值。 while(head!=0){ if(head->val!=head_->val) return false; head=head->next; head_=head_->next; } return true; }