判斷一個鏈表是否爲迴文結構。(時間複雜度要求O(n),空間複雜度要求O(1))

    題目要求:算法

    對於一個鏈表,請設計一個時間複雜度爲O(n),額外空間複雜度爲O(1)的算法,判斷其是否爲迴文結構。測試

    給定一個鏈表的頭指針A,請返回一個bool值,表明其是否爲迴文結構。保證鏈表長度小於等於900。spa

    測試樣例:設計

1->2->2->1
返回:true

    解題思路:使用快慢指針找到鏈表的中間結點,而後將中間結點及以後的結點反轉,獲得形如
指針

1->2->3<-2<-1
1->2->3->3<-2<-1

    的鏈表,而後進行值得比較,直到兩個指針相等或者前面指針的下一個指針即爲後面的指針。code

    (這個方法會改變原先鏈表的結構)
orm

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        if(A == NULL){
            return false;
        }else if(A->next == NULL){
            return true;
        }
        ListNode *fast = A,*slow = A;
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
        }
        ListNode *p = slow->next;
        ListNode *p1 = p->next;
        while(p != NULL){
            p->next = slow;
            slow = p;
            p = p1;
            p1 = p1->next;
        }
        //if(A->val == slow->val){
           while(A != slow){
               if(A->val != slow->val){
                   return false;
               }
               if(A->next = slow){
                   return true;
               }
               A = A->next;
               slow = slow->next;
           }
        //}
        return true;
    }
};

    若是須要不改變原先鏈表的結構,則能夠先使用快慢指針找到中間結點以及尾結點,而後每次從中間結點開始向後找到當前尾指針的前一個結點,依次比較,直到頭指針爲中間結點爲止。
it

相關文章
相關標籤/搜索