leetcode234 C++ 28ms 回文链表

/**
 * 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 == nullptr || head->next == nullptr){
            return true;
        }

        ListNode* p_len = head;
        int len = 0;

        while(p_len != nullptr){
            p_len = p_len->next;
            len++;
        }

        ListNode* right = head;
        ListNode* curr = head;
        ListNode* prev = nullptr;

        for(int i=0;i<(len/2);i++){
            right = curr->next;
            curr->next = prev;
            prev = curr;
            curr = right;
        }
        if(len%2 == 1){
            right = right->next;
        }
        while(prev !=nullptr && right != nullptr){
            if(prev->val != right->val){
                return false;
            }
            prev=prev->next;
            right=right->next;
        }

        return true;


    }
};

思路是:
先遍历第一遍得到长度。
取两个指针,第一个指针配合prev指针将前半部分反转,第二个指针顺势移到链表的中间右边的节点。
这样两个指针分别从中间向左右移动,互相比较。

posted @ 2018-07-24 21:59  一条图图犬  阅读(377)  评论(0编辑  收藏  举报