题目描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
ListNode* man=A;
ListNode* kuai=A;
ListNode* list1=A;
bool isOdd;
while(true){
if(kuai->next==NULL){
isOdd=true;
break;
}
if(kuai->next->next==NULL){
isOdd=false;
break;
}
kuai=kuai->next->next;
man=man->next;
}
//reverse
ListNode* index=man->next;
ListNode* list2=index;
while(index!=NULL){
ListNode* temp=index->next;
index->next=list2;
list2=index;
index=temp;
}
if(isOdd){
ListNode* tail=A;
ListNode* head=list2;
while(true){
if(tail->val!=head->val){
return false;
}
else{
if(tail->next==man){
return true;
}
tail=tail->next;
head=head->next;
}
}
}
else{
ListNode* tail=A;
ListNode* head=list2;
while(true){
if(tail->val!=head->val){
return false;
}
else{
if(tail==man){
return true;
}
tail=tail->next;
head=head->next;
}
}
}
return true;
}
};