题目:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。
解题思路:
首先我们找到该链表的中数,

然后将中数后的所有数逆转,然后从头和该中数进行比较

总代码:
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
if(A==NULL||A->next==NULL)
{
return true;
}
struct ListNode* slow,*fast,*cur,*nxt,*prev;
slow=fast=A;
while(fast&&fast->next)//快慢指针找中数
{
slow=slow->next;
fast=fast->next->next;
}
prev=NULL;
cur=slow;
while(cur)//逆转
{
nxt=cur->next;
cur->next=prev;
prev=cur;
cur=nxt;
}
while(A&&prev)//进行比较
{
if(A->val!=prev->val)
{
return false;
}
A=A->next;
prev=prev->next;
}
return true;
}
};
图解:
第一步:设定

第二步:
第三步:

就相当于

然后逐一比较,只要不相等返回false即可
本文介绍了如何在O(n)时间和O(1)空间复杂度下判断链表是否为回文结构。通过快慢指针找到链表中点,然后逆转中点之后的链表,再对比头节点和逆转后的中点,若所有节点值相等则为回文链表。
484

被折叠的 条评论
为什么被折叠?



