对于一个链表,请设计一个时间复杂度为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)return false;
else if (A->next == NULL)return true;
//特殊情况判断完成了,找到中点位置
ListNode*fast = A;
ListNode*slow = A;
while (fast != NULL&&fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
//上面的循环结束后slow为中点位置
ListNode*mid = slow;
//下面开始反转中点后续的链表
ListNode *af_p1 = slow->next;
ListNode *af_p2 = slow;
ListNode *temp = NULL;
while (af_p1) {
temp = af_p1;
af_p1 = af_p1->next;
temp->next = af_p2;
af_p2 = temp;
}
//上面的循环结束后,temp==af_p2==链表的最后,af_p1==null
mid->next = NULL;
ListNode *head = A;
bool isre = true;
while (head&&af_p2) {
if (head->val != af_p2->val) {
isre = false;
break;
}
else {
head = head->next;
af_p2 = af_p2->next;
}
}
//上面的循环已经判断出了链表是否为回文链表,但是需要将已经被破坏的链表恢复
af_p1 = temp->next;
af_p2 = temp;
af_p2->next = NULL;
while (af_p1) {
temp = af_p1;
af_p1 = af_p1->next;
temp->next = af_p2;
af_p2 = temp;
}
return isre;
}
};