234. Palindrome Linked List(C语言版本)

来源:互联网 发布:华通云数据业界排名 编辑:程序博客网 时间:2024/06/05 09:27

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?


解题思路:

    1 首先,找到该链表的中心。

    2 接着,将链表的后半部分反序。

    3 接着,将前半部分与后半部分进行比较(只需要比较到一半就可以判断是不是回文)


代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */bool isPalindrome(struct ListNode* head) {    if(head == NULL || head->next == NULL)        return true;    struct ListNode *fast = head;    struct ListNode *slow = head;    while(fast->next != NULL && fast->next->next != NULL)    {        fast = fast->next->next;        slow = slow->next;    }        struct ListNode *secondHead = slow->next;    slow->next = NULL;        struct ListNode *p1 = secondHead;    struct ListNode *p2 = p1->next;        while(p1 != NULL && p2 != NULL)    {        struct ListNode *temp = p2->next;        p2->next = p1;        p1 = p2;        p2 = temp;    }        secondHead->next = NULL;        struct ListNode *p = (p2 == NULL?p1:p2);    struct ListNode *q = head;    while(p != NULL)    {        if(p->val != q->val)            return false;        p = p->next;        q = q->next;    }        return true;}


原创粉丝点击