描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
回文结构(链表对称)
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
示例
示例1
1->2->2->1
返回:true
示例2
1->2->3->2->1
返回: true
示例3
1->2->4->5->6
返回: false
解题思路以及代码
1.找中间结点
2.反转链表
3.比较
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
//找中间结点
ListNode* fast,*slow;
fast=slow=A;
while(fast && fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
//反转链表
ListNode* head=NULL,*next=NULL;
while(slow)
{
next=slow->next;
slow->next=head;
head=slow;
slow=next;
}
//比较
ListNode* cur1=A,*cur2=head;
while(cur1 && cur2)
{
if(cur1->val != cur2->val)
return false;
cur1=cur1->next;
cur2=cur2->next;
}
return true;
}
};