LeetCode - 234. Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Input: 1->2 Output: false
Input: 1->2->2->1 Output: true
Follow up: Could you do it in O(n) time and O(1) space?
这题的难度竟然是easy,,可能没有算 follow up吧。我们需要在 O(n) 的时间复杂度和 O(1) 的空间复杂度下判断一个链表是不是回文的,所以肯定不能用额外空间了,单链表又不能逆序遍历,所以肯定是一个指针从头部,一个指针从中间,同时向后遍历。但是这样需要先找到链表的一半位置,然后翻转后半部分,就可以像前边说的一样遍历判断了。
找到一半位置肯定是用快慢指针来实现,不过需要注意奇数节点和偶数节点是不一样的。
// 返回翻转后的链表头部
ListNode* reverseList(ListNode* head) {
if(!head) return nullptr;
ListNode *pre = nullptr, *cur = head;
while(cur) {
ListNode *t = cur->next;
cur->next = pre;
pre = cur;
cur = t;
}
return pre;
}
bool isPalindrome(ListNode* head) {
if(!head || !head->next) return true;
ListNode *fast = head, *slow = head, *half_head; // 另一半的头部
while(fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
if(fast) // 链表共奇数个节点
half_head = reverseList(slow->next);
else // 链表共偶数个节点
half_head = reverseList(slow);
while(head && half_head) {
if(head->val != half_head->val) return false;
head = head->next;
half_head = half_head->next;
}
return true;
}