题目描述
对于一个链表,请设计一个时间复杂度为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) {
if(A == NULL || A->next == NULL)
return true;
ListNode* slow,*fast,*prev,*cur,*nxt;
slow = A;
fast = A;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
cur = slow;
prev = NULL;
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;
}
};