通过快慢指针找到链表中间结点,然后反转链表的后半部分,再与前半部分进行比较来判断链表是否为回文链表
时间复杂度O(n)
空间复杂度O(1)
class Solution {public:bool isPalindrome(ListNode* head) {ListNode *half = halfL(head);ListNode *front = head;ListNode *back = reverseL(half);// 如果链表结点数量是偶数的话,快慢指针返回的中间结点刚好是中间两个结点的后一个结点。反转后前半部分比后半部分多一个中间结点// 如果链表结点数量是奇数的话。快慢指针返回的中间结点刚好是中间结点。反转后前后半部分长度相同,都以中间结点结尾// 而中间结点不会影响最后结果,所以这里的判断条件是两个结点都不为空,最后前半部分会剩下一个结点。while (back && front) {if (back->val != front->val) return false;back = back->next;front = front->next;}return true;}ListNode *halfL(ListNode *head) {ListNode *res = nullptr;ListNode *slow = head;ListNode *fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;}ListNode *reverseL(ListNode *head) {ListNode *cur = head;ListNode *pre = nullptr;while (cur) {ListNode *tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}};
