Leetcode 234. Palindrome Linked List迴文鏈表

一、題目描述

判斷鏈表是否是迴文鏈表,要求時間複雜度爲O(n),空間複雜度爲O(1)

二、解題思路

1、取得鏈表的長度
2、反轉任意一半鏈表
3、雙指針從前往後掃描,判斷是否是迴文鏈表

三、代碼實現

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {

    /**
    1.獲取鏈表長度
    */
    public int lengthOfList(ListNode head) {
        ListNode p = head;
        int n = 0;
        while ( p != null) {
            n++;
            p = p.next;
        }
        return n;
    }

    /**
    2.反轉一半鏈表
    */
    public ListNode reverseList(ListNode head) {
        ListNode pre = head;
        ListNode p = pre.next;
        ListNode next;
        while (p != null) {
            next = p.next;
            p.next = pre;
            pre = p;
            p = next;
        }
        head.next = null;
        return pre;
    }
    /**
    3.判斷是否是迴文鏈表
    */
    public boolean isPalindrome(ListNode head) {
        if (head == null || head.next == null)
            return true;
        int n = lengthOfList(head); //獲取鏈表的長度
        int half = n/2;
        //1 2 3 4 3 2 1
        ListNode leftEnd = head;
        for (int i = 0; i < half - 1; i++) {
            leftEnd = leftEnd.next;
        }
        ListNode rightStart = leftEnd.next;
        if(n%2 != 0){
            rightStart = rightStart.next;
        }
        rightStart = reverseList(rightStart);
        ListNode leftStart = head;
        for (int i = 1; i <= half; i++) {
            if(leftStart.val != rightStart.val) {
                return false;
            } else {
                leftStart = leftStart.next;
                rightStart = rightStart.next;
            }
        }
        return true;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章