1. 程式人生 > 實用技巧 >Leetcode0234. 迴文連結串列

Leetcode0234. 迴文連結串列

234. 迴文連結串列

方法: 快慢指標

主要思路: 使用快慢指標,從第一個位置開始(不是從dummyHead開始),slow最後指向的是靠後中間位置;(類似於二分)
然後我們可以在慢指標移動過程中,將前面一半的連結串列反轉;slow之前的所有節點都以反轉next。
我們獲得前後兩段連線: l1 = prevl2 = next;
當連結串列為奇數個結點的時候,l2中節點個數比l1多一個;
後續我們只需要判斷一下,當前fast指標是否為null,判斷連結串列節點個數為奇數還是偶數,是奇數則後移一個位置;
在對兩個連結串列是否相等進行進行判斷;
時間複雜度:O(n)

/**
 * 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;
        // 兩個都從第一個開始後移;slow指向靠後位置;
        ListNode slow = head, fast = head;
        ListNode prev = head;
        while(fast != null && fast.next != null) {
            // fast後移;
            fast = fast.next.next;

            ListNode next = slow.next;
            slow.next = prev;
            prev = slow;
            slow = next;
        }

        //slow之前所有的節點都往前指了;
        ListNode l1 = prev;
        ListNode l2 = slow;
        // 如果fast!= null 則是, 奇數個點,slow指向後面;
        // 往後移動一位
        if(fast != null) {
            l2 = l2.next;
        } 
        while(l2 != null) {
            if(l1.val != l2.val)
                return false;
            l2 = l2.next;
            l1 = l1.next;
        }
        return true;
    }
}