LeetCode|234.迴文鏈表

題目描述

  • 等級: 簡單 請判斷一個鏈表是否爲迴文鏈表。

示例 1:java

輸入: 1->2
輸出: false

示例 2:指針

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

進階: 你可否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?code

思路

對於單鏈表迴文快慢指針鏈表反轉的考察。blog

「迴文」是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如「我爲人人,人人爲我」等。在數學中也有這樣一類數字有這樣的特徵,成爲迴文數(palindrome number)。 [1] 設n是一任意天然數。若將n的各位數字反向排列所得天然數n1與n相等,則稱n爲一回文數。例如,若n=1234321,則稱n爲一回文數;但若n=1234567,則n不是迴文數。 [1]遊戲

注意:get

  1. 偶數個的數字也有迴文數124421
  2. 小數沒有迴文數

鏈表反轉請參考:反轉單鏈表數學

經過兩個快慢指針能夠獲取鏈表中的中間位置節點。(快慢指針步數相差一倍)it

答案

public boolean isPalindrome(ListNode head) {
        //一、邊界檢查,空鏈表與只有一個節點的鏈表直接返回true
        if (head == null || head.next == null) {
            return true;
        }

        //二、經過快慢指針找到鏈表中間位置
        ListNode fast = head;
        ListNode slow = head;
        //當快節點走到終點,則慢節點的位置正好爲鏈表中間
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        //fast做爲後半段的起始節點
        fast = slow;
        //slow做爲前半段的起始節點
        slow = head;

        //三、反轉後半段鏈表
        //定義pre存儲前一個節點
        ListNode pre = null;
        while (fast != null) {
            //指定當前要調整的點。
            ListNode temp = fast;
            //fast指針後移,走向下一個要被調整的點。
            fast = fast.next;
            //將當前的點反轉
            temp.next = pre;
            //pre指針重置到最前
            pre = temp;
        }

        //四、對比先後兩段鏈表是否相同
        //由於奇數個節點時,後半段鏈表比前半段鏈表多1個,因此循環時之前半段鏈表爲主
        while (slow != null && pre != null) {
            if (slow.val != pre.val) {
                return false;
            }
            slow = slow.next;
            pre = pre.next;
        }
        return true;
    }

結果

234.png


tencent.jpg

相關文章
相關標籤/搜索