算法之鏈表迴文鏈表判斷

問題描述

編寫一個函數,檢查輸入的鏈表是否是迴文的。

示例:

輸入: 1->2
輸出: false
輸入: 1->2->2->1
輸出: true

方法一

   /**
     * 要求時間複雜度爲O(n),空間複雜度爲O(1)
     *1.獲取中間位置
     *  獲取中間位置,可以通過快慢指針實現
     *2.從中間位置一次向兩側對比
     *  從中間向兩側對比,需要將左半部分進行翻轉,才能夠實現
     */
    public boolean isPalindrome(ListNode head) {
        if(head==null){
            return true;
        }
        //1.獲取中間位置
        //獲取中間位置,可以通過快慢指針實現
        ListNode slow = head;
        ListNode fast = head;
        //左側鏈表翻轉後的頭部
        ListNode pre = null;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            //記錄下一個節點
            ListNode tmpNextForSlow = slow.next;
            //slow結點針對於pre是頭部插入
            slow.next = pre;
            pre = slow;
            //將slow指向下一個結點
            slow = tmpNextForSlow;
        }

        ListNode right;
        //判斷當前的鏈表長度是奇數還是偶數
        //1->2->3 如果fast有值,則爲奇數長度.pre 指向1 ,slow指向2,那麼需要right指向3即可
        //1->2->3->4 如果fast有值,則爲奇數長度.pre 指向2,slow指向3,那麼需要right=slow即可
        if(fast!=null){
            right = slow.next;
        }else{
            right = slow;
        }
        //2.從中間位置一次向兩側對比
        //從中間向兩側對比,需要將左半部分進行翻轉,才能夠實現
        while(right!=null&&pre!=null){
            if(right.val!=pre.val){
                return false;
            }
            right = right.next;
            pre = pre.next;
        }
        return true;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章