Leetcode典型題解答和分析、歸納和彙總——T234(迴文鏈表)

問題描述:

請判斷一個鏈表是否爲迴文鏈表。

要求:採用時間複雜度爲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;

  }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章