首页 > 代码库 > 234. Palindrome Linked List

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;    }};

 

234. Palindrome Linked List