题目来源:牛客网
题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
代码:
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* newhead=NULL;
struct ListNode* cur=head;
while(cur){
struct ListNode* next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* head) {
ListNode* mid=middleNode(head);
ListNode* rhead=reverseList(mid);
while(rhead&&head){
if(rhead->val!=head->val){
return false;
}
rhead=rhead->next;
head=head->next;
}
return true;
}
};
思路:我们先找到链表的中间节点,比如1,2,2,1,我们找到第二个2,如果是1,2,3,2,1,我们就找到3,然后从这里开始对链表进行逆置,即1,2变为2,1,此时就会变为1,2,1,2我们再对链表顺序比较即可,链表的求中间节点和逆置我们之前是写过的,我这里再放一下链接