問題描述:
請判斷一個鏈表是否爲迴文鏈表。
要求:採用時間複雜度爲O(n)和空間複雜度爲O(1)。
問題分析:
要時空間複雜度爲常數級別,則必須採用常規的快慢指針方式,而且最多隻能遍歷一次。
我們使用快慢指針的同時還翻轉前半部分,然後與後半部分進行比較。
class Solution{
public:
bool isPalindrome(ListNode* head){
if(!head||!head->next) return true;
ListNode *fast = head, *slow = head;
ListNode *p, *pre = nullptr;
while(fast&&fast->next)
{
p = slow; //保存slow節點
slow = slow->next; //慢指針
fast = fast->next->next; //快指針
p->next = pre; //讓
pre = p;
}
if(fast) slow=slow->next; //表示鏈表爲奇數個節點,則slow要達到中間節點之後
while(p)
{
if(p->val!=slow->val)
return false;
p=p->next;
slow=slow->next;
}
return true;
}
};