首先我们先来看一下这个题目的限制条件,它规定了时间复杂度与空间复杂度,这就证明,我们的链表只能够遍历一遍,所以就不能够应用将链表后方的重复部分存储到数组内再进行比较的方法了。所以根据我们之前做过的单链表中的题目我们可以想到这个方法:我们可以先应用快慢指针找到单链表的中间节点,再将后面的节点全部逆置,再比较前面部分与后面部分的节点数据是否相同,如果相同则返回true,如果不同则返回false。那么我们现在来实现一下这个方法。
typedef struct ListNode ListNode;
class PalindromeList
{
public:
ListNode* FindMid(ListNode*A)
{
ListNode*slow=A;
ListNode*fast=A;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
ListNode*reverse(ListNode*A)
{
ListNode*pcur=A;
ListNode*newhead=NULL;
while(pcur)
{
ListNode*next=pcur->next;
pcur->next=newhead;
newhead=pcur;
pcur=next;
}
return newhead;
}
bool chkPalindrome(ListNode* A)
{
// write code here
ListNode*mid=FindMid(A);
ListNode*rmid=reverse(mid);
while(rmid&&A)
{
if(rmid->val!=A->val)
{
return false;
}
rmid=rmid->next;
A=A->next;
}
return true;
}
};
大家感兴趣的可以自行尝试一下哦~