234. Palindrome Linked List

判斷是否是迴文鏈表,儘量在O(n)時間複雜度。

思路:

快慢指針,慢指針指向的前面一部分序列倒序(從後向前指)。當快指針到頭時剛好慢指針把前一半倒序。

此時Pre指針指向的是前面一般=半鏈表的倒敘的頭, 慢指針指向後面一半的頭。

注意如果循環結束時快指針不是空則說明鏈表節點數是奇數個,那slow指針要向前移一個。還有循環判斷條件應該是next 和next.next

還有要先更改快指針,否則會收到慢指針的影響。

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode slow=head, fast=head, pre=null;
        
        while(fast!=null && fast.next!=null){
            fast = fast.next.next;
            ListNode tmp = slow.next;
            slow.next = pre;
            pre = slow;
            slow = tmp;
        }
        if(fast!=null){
            slow = slow.next;
        }        
        while(pre!=null && slow!=null){
            if(pre.val != slow.val)
                return false;
            pre = pre.next;
            slow = slow.next;
        }
        return true;
    }
}

 

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