題目要求:算法
對於一個鏈表,請設計一個時間複雜度爲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