回文链表

来源:互联网 发布:空浪 知乎 编辑:程序博客网 时间:2024/06/16 10:47

设计一种方式检查一个链表是否为回文链表。

样例

1->2->1 就是一个回文链表。

挑战

O(n)的时间和O(1)的额外空间。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    /**     * @param head a ListNode     * @return a boolean     */    bool isPalindrome(ListNode* head) {        // Write your code here        if (head == NULL)        {            return true;        }        ListNode *p = head;        ListNode *q = head;        while (p->next != NULL && p->next->next != NULL)        {            p = p->next->next;            q = q->next;        }        ListNode *r = reverseList(q->next);        p = head;        while (r != NULL)        {            if (p->val != r->val)            {                return false;            }            p = p->next;            r = r->next;        }        return true;    }private:    ListNode* reverseList(ListNode *head)    {        if (head == NULL)        {            return NULL;        }        ListNode *p = head->next;        ListNode *q = head;        q->next = NULL;            while (p != NULL)        {            ListNode *next = p->next;            p->next = q;            q = p;            p = next;        }        return q;    }};


0 0
原创粉丝点击