迴文連結串列【234】
阿新 • • 發佈:2020-10-25
請判斷一個連結串列是否為迴文連結串列。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
思路:
1.使用快慢指標找到連結串列的中間點
2.反轉中間點後面的連結串列
3.後半段反轉後的連結串列與上半部分連結串列比對,如果比對完後都相同,返回true
程式碼:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public boolean isPalindrome(ListNode head) { if(head == null || head.next == null){return true;} ListNode middle = getMiddle(head); ListNode pre = reverse(middle.next); // 判斷是否迴文 ListNode p1 = head; ListNode p2 = pre; boolean result = true; while (result && p2 != null) { if (p1.val != p2.val) { result = false; } p1 = p1.next; p2 = p2.next; } return result; } //快慢指標 private ListNode getMiddle(ListNode head){ ListNode slow = head; ListNode fast = head; while(fast.next != null && fast.next.next != null){ fast = fast.next.next; slow = slow.next; } return slow; } //反轉連結串列 private ListNode reverse(ListNode head){ ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode temp = curr.next; curr.next = prev; prev = curr; curr = temp; } return prev; } }