1. 程式人生 > >leetcode-234 迴文連結串列(PalindromeLinkedList)-java

leetcode-234 迴文連結串列(PalindromeLinkedList)-java

題目:迴文連結串列

請檢查一個連結串列是否為迴文連結串列。

進階:

你能在 O(n) 的時間和 O(1) 的額外空間中做到嗎?

public boolean isPalindrome(ListNode head) {
    if (head == null || head.next == null)
        return true;
    ListNode fast = head;
    ListNode slow = head;
    while (fast.next != null && fast.next.next != null) {
        slow = slow.next
; fast = fast.next.next; } ListNode reverseHead = reverseList(slow.next); while (head != null && reverseHead != null) { if (head.val != reverseHead.val) return false; head = head.next; reverseHead = reverseHead.next; } return true
; }
public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null)
        return head;
    ListNode p = null;
    ListNode q;
    while (head != null) {
        q = head.next;
        head.next = p;

        p = head;
        head = q;
    }
    return p;
}

邊界值判斷:

head == null

    // 空連結串列,迴文,返回true

head.next == null    // 只有一個節點的連結串列,迴文,返回true

變數註釋:

fast    // 快指標,初始化為head

slow    // 慢指標,初始化為head

reverseHead    // 後半連結串列反轉後的頭結點

解題思路:

(1)利用快慢指標找到連結串列中點(後半連結串列的頭結點   // 連結串列長度為n,後半連結串列的頭節點為(n+1)/2 + 1;

(2)反轉後半連結串列,拿到反轉後的連結串列的頭節點    // 對反轉連結串列有疑問的,點選 反轉連結串列 瞭解詳情

(3)前半段連結串列  與  反轉後的後半段連結串列  依次進行比較,都相等就是迴文連結串列    // 連結串列長度為奇數時,忽略前半段連結串列的最後一個節點