/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// write code here
//判断链表是否是回文结构要用到快慢指针
//即当快指针走完整个链表时慢指针要么正好在链表的后半部分(长度为偶)
//要么慢指针正好走到后半部分的前一个节点(长度为奇数)
ListNode*fastP=head,*lowP=head;//定义快慢指针
while(fastP&&fastP->next)//循环结束条件为快指针不为空或者快指针的后面还有节点
{
fastP=fastP->next->next;//快指针一次走两步
lowP=lowP->next;//慢指针一次走一步
}
ListNode* end=lowP;
ListNode* Head=reverse(lowP);//反转后半部分链表
while(Head&&head!=end)
{
if(Head->val!=head->val)
return false;
Head=Head->next;
head=head->next;
}
return true;
}
ListNode* reverse(ListNode* head)
{
ListNode* tmp=NULL,*rear=head->next;
while(rear)
{
head->next=tmp;
tmp=head;
head=rear;
rear=head->next;
}
head->next=tmp;
return head;
}
};
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// write code here
//判断链表是否是回文结构要用到快慢指针
//即当快指针走完整个链表时慢指针要么正好在链表的后半部分(长度为偶)
//要么慢指针正好走到后半部分的前一个节点(长度为奇数)
ListNode*fastP=head,*lowP=head;//定义快慢指针
while(fastP&&fastP->next)//循环结束条件为快指针不为空或者快指针的后面还有节点
{
fastP=fastP->next->next;//快指针一次走两步
lowP=lowP->next;//慢指针一次走一步
}
ListNode* end=lowP;
ListNode* Head=reverse(lowP);//反转后半部分链表
while(Head&&head!=end)
{
if(Head->val!=head->val)
return false;
Head=Head->next;
head=head->next;
}
return true;
}
ListNode* reverse(ListNode* head)
{
ListNode* tmp=NULL,*rear=head->next;
while(rear)
{
head->next=tmp;
tmp=head;
head=rear;
rear=head->next;
}
head->next=tmp;
return head;
}
};