对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
题目分析
- 因为单链表结构特殊,判断回文不能直接根据首尾直接判定,这里一定要想到链表长度这一点,凡是与链表长度相关的问题,不妨都考虑一下快慢指针的方法
- 回文链表的实质就是将后半段链表逆置,如果是回文,那么必定与前半段链表相等。
步骤:
- 利用快慢指针找到链表中间结点
- 逆置后半段链表
- 判断两条链表是否相等
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
if(A==NULL)
{
return false;
}
if(A->next==NULL)
{
return true;
}
ListNode* slow=A;
ListNode* fast=A;
ListNode* cur=A;
//用快慢指针找到中间结点
while(fast!= NULL && fast->next != NULL)
{
slow=slow->next;
fast=fast->next->next;
}
//逆置后半段链表
ListNode* last=NULL;
ListNode* prev=NULL;
while(slow != NULL){
last=slow->next;
slow->next=prev;
prev=slow;
slow=last;
}
while(cur!=NULL && prev!=NULL)
{
if(cur->val == prev-> val)
{
cur=cur->next;
prev=prev->next;
}
else{
return false;
}
}
return true;
}
};