对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1返回:true
解题思路:
1、找到链表的中点,
2、翻转后半部分的链表节点
3、依次比较是否一致,如果一致则为回文结构
实现代码:
bool chkPalindrome(ListNode* A) {
struct ListNode* fast, *slow ,*cur,*prev;
fast = slow = A;
while(fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next;
slow->next = NULL;
while(fast) {
cur = fast->next;
if(cur == NULL) {
prev = fast;
}
fast->next = slow;
slow = fast;
fast = cur;
}
fast = prev;
slow = A;
while(fast) {
if(fast->val != slow->val){
return false;
}
fast= fast->next;
slow= slow->next;
}
return true;
}
运行结果: