234. Palindrome Linked List
Problem statement
Given a singly linked list, determine if it is a palindrome.
Follow up: Could you do it in O(n) time and O(1) space?
Solution
This is very typical link list problem since it includes two basic and important operations for link list: find middle and reverse the link list.
Generally, we can solve it through three main steps:
- Find the middle of the link list
- Reverse the link list from the next of middle
- Compare head and middle to test if the given link list is a palindrome
Time complexity is O(n), space complexity is O(1).
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool isPalindrome(ListNode* head) { if(head == NULL || head->next == NULL){ return true; } ListNode* mid = find_mid(head); mid->next = reverse(mid->next); ListNode* start = mid->next; mid->next = NULL; while(head && start){ if(head->val != start->val){ return false; } head = head->next; start = start->next; } return true; } private: ListNode* find_mid(ListNode* head){ ListNode* fast = head->next; ListNode* slow = head; while(fast != NULL && fast->next != NULL){ fast = fast->next->next; slow = slow->next; } return slow; } private: ListNode* reverse(ListNode* head){ ListNode* prev = NULL; ListNode* next = NULL; while(head){ next = head->next; head->next = prev; prev = head; head = next; } return prev; } };