234. Palindrome Linked List

来源:互联网 发布:永久域名之小明看看 编辑:程序博客网 时间:2024/05/14 10:24

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?

思路:想到链表就要想到他的特点和一些快速定位的方法,比如快慢指针,还有链表反转的函数要随手能写出来。这题可以先定位到中间节点,然后把后面的半段翻转就好(注意翻转后想当于middle的next要指向以前的尾部节点,这点开始没有想到,写错了半天)然后前后两段顺序比较就好。试过不考虑空间复杂度,还可以用stack来存前半段,后半段不用翻转直接比较就可以了。都是O(n)的时间复杂度。
参考:http://www.cnblogs.com/grandyang/p/4635425.html

/** * 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 *middle = findMiddle(head);        middle->next = reverseList(middle->next);        ListNode *firstHalf = head, *secondHalf = middle->next;        while(secondHalf!=NULL && firstHalf->val == secondHalf->val)        {            firstHalf = firstHalf->next;            secondHalf = secondHalf->next;        }        return secondHalf==NULL;    }private:ListNode* findMiddle(ListNode* head){    ListNode *slow = head, *fast = head;    while(fast->next!=NULL && fast->next->next!=NULL)    {        slow = slow->next;        fast = fast->next->next;    }    return slow;}private:ListNode* reverseList(ListNode* head){    ListNode* pre = NULL;    while(head!=NULL)    {        ListNode* tmp = head->next;        head->next = pre;        pre = head;        head = tmp;    }    return pre;}};
0 0
原创粉丝点击