234. Palindrome Linked List
Easy
1852268FavoriteShare
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
class Solution {
public:
ListNode* GetMid(ListNode* head){
ListNode* Fast = head;
ListNode* Slow = head;
while(Fast->next != NULL && Fast->next->next != NULL){
Slow = Slow->next;
Fast = Fast->next->next;
}
return Slow;
}
ListNode* Reverse(ListNode* mid){
ListNode* PreNode = NULL;
ListNode* CurrentNode = mid->next;
ListNode* ReverseHead = NULL;
while(CurrentNode != NULL){
ListNode* NextNode = CurrentNode->next;
if(NextNode == NULL){
ReverseHead = CurrentNode;
}
CurrentNode->next = PreNode;
PreNode = CurrentNode;
CurrentNode = NextNode;
}
return ReverseHead;
}
bool isPalindrome(ListNode* head) {
if(head == NULL ||head->next == NULL){
return true;
}
ListNode* MiddleNode = GetMid(head);
ListNode* ReverseHead = Reverse(MiddleNode);
while(head != NULL && ReverseHead != NULL){
if(head->val != ReverseHead->val){
return false;
}
head = head->next;
ReverseHead = ReverseHead->next;
}
return true;
}
};