思路:将链表从中间断开,反转后半段链表,然后再依次比较反转后的后半段链表与前半段链表,如果遇到不相等的结点直接返回false,否则返回true
用到俩个技巧——快慢指针和反转链表
用快慢指针找到链表的中点,但这里我们需要的是中点的前一个结点,只需要把原来的循环条件while(fast && fast->next) 改为 while(fast->next && fast->next->next),找到后再让headtwo = slow(链表的后半段),slow->next = nullptr(断开前半段链表),再进行后半段链表的反转,headtwo = reverse(headtwo),最后再将前半段链表结点的值与后半段链表结点的值依次进行比较,当遇到不相等的值时,直接返回false,否则返回true
代码实现如下:
class Solution {
public:
ListNode* reverseLink(ListNode* head){
if(!head)
return nullptr;
ListNode* dummy = new ListNode(0,nullptr);
ListNode* nextnode, *prenode = head;
while(prenode){
nextnode = prenode->next;
prenode->next = dummy->next;
dummy->next = prenode;
prenode = nextnode;
}
return dummy->next;
}
bool isPalindrome(ListNode* head) {
ListNode* fast = head, *slow = head;
ListNode* headtwo;
while(fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
headtwo = slow->next;
slow->next = nullptr;
headtwo = reverseLink(headtwo);
while(head && headtwo){
if(head->val != headtwo->val)
return false;
head = head->next;
headtwo = headtwo->next;
}
return true;
}
};