对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
回文链表形如:1->2->3->2->1
//回文链表
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
if(A==NULL||A->next==NULL){
return true;
}
ListNode* fast=A;
ListNode* slow=A;
ListNode* head=A;
ListNode* tmp=NULL;
ListNode* tmp2=NULL;
//找到中间结点的后一个结点
while(fast){
slow=slow->next;
if(fast->next==NULL){
fast=fast->next;
}else{
fast=fast->next->next;
}
}
//将链表的后半部分逆置
tmp=slow;
slow=slow->next;
tmp->next=NULL;
while(slow){
tmp2=slow;
slow=slow->next;
tmp2->next=tmp;
tmp=tmp2;
}
//比较前半部分和后半部分,若比较完之前存在不相等的情况,返回false,否则true;
while(head&&tmp2){
if(head->val==tmp2->val){
head=head->next;
tmp2=tmp2->next;
}else{
return false;
}
}
return true;
}
};