leetcode-234 迴文連結串列(PalindromeLinkedList)-java
阿新 • • 發佈:2019-02-05
題目:迴文連結串列
請檢查一個連結串列是否為迴文連結串列。
進階:
你能在 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)前半段連結串列 與 反轉後的後半段連結串列 依次進行比較,都相等就是迴文連結串列 // 連結串列長度為奇數時,忽略前半段連結串列的最後一個節點