题目描述:
判断一个链表是否为回文链表。要求空间复杂度为$O(1)$。
题解:
用快慢指针找到中点,然后将链表前半部分反转进行对比就行。这里要注意的是链表长度奇、偶的问题,如下所示:
可以看出只要将$slow$指向的结点以及其之后的节点反转之后进行对比就可以了。值得一提的是注意一下链表结束情况的判断,奇数长度的链表左、右两边的长度不一直,实际上无论左、右哪部分链表遍历结束之后就可以两部分链表的遍历了。
AC代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* Rever(ListNode* tmp) { ListNode* pre = NULL; while(tmp) { ListNode* Next = tmp->next; tmp->next = pre; pre = tmp; tmp = Next; } return pre; } bool isPalindrome(ListNode* head) { if(head == NULL) return true; ListNode* faster = head; ListNode* slow = head; // 快慢指针 + 反转链表 分情况() while(faster && faster->next) { slow = slow->next; faster = faster->next->next; } ListNode* r = Rever(slow); ListNode* l = head; while(l!=slow && r!=NULL) { if(l->val != r->val) return false; l = l->next; r = r->next; } return true; } };