LeetCode——第234題:迴文鏈表

題目:

請判斷一個鏈表是否爲迴文鏈表。

示例 1:

輸入: 1->2
輸出: false

示例 2:

輸入: 1->2->2->1
輸出: true

進階:

你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?

進階思考:反轉再比較,反轉用頭插法。

代碼:

package leetCode;

import java.util.concurrent.SynchronousQueue;

import leetCode.Nineteen.ListNode;

/**
 * 2018.7.23
 * 迴文鏈表
 * @author dhc
 *
 */
public class TwoHundredAndThirtyFour {
    public class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }
    //思路:可以先遍歷一下鏈表求長度,並且保存鏈表值,然後第二遍遍歷的時候從鏈表的中間開始判斷,即判斷對應位置的數
    //但是空間複雜度爲O(n),   2ms
    //看了一下前面大佬的答案,大概都用到了對鏈表的反轉,一種是反轉後半部分鏈表在比較,一種是直接反轉整個鏈表,如果反轉
    //鏈表時用的是遞歸的話,空間複雜度爲O(n),如果用的是頭插法的話,空間複雜度就是O(1)
    public static boolean isPalindrome(ListNode head) {

        if(head == null || head.next == null) {
            return true;
        }
        boolean flag = true;
        ListNode tem = head;
        int length = 0;
        //求鏈表長度
        while(tem != null) {
            length++;
            tem = tem.next;
        }
        int[] val = new int[length/2];
        tem = head;
        int index = 0;
        int index1 = 0;
        boolean flag1 = true;
        while(tem!=null) {
            //先把前面部分的數存到數組 中
            if(index1 < length/2) {
                val[index1++] = tem.val;
                tem = tem.next;
                index = index1;
            }else {
                //從後面部分開始依次和前面對應的數比較,這裏需要區分一下長度爲奇偶的不同
                if(length%2 == 0) {
                    if(val[--index] != tem.val) {
                        flag = false;
                        break;
                    }
                    tem = tem.next;
                }else {
                    if(flag1) {
                        flag1 = false;
                        tem = tem.next;
                    }else {
                        if(val[--index] != tem.val) {
                            flag = false;
                            break;
                        }
                        tem = tem.next;
                    }
                }
            }

        }
        return flag;
    }
    public static void main(String[] args) {
        ListNode head = new TwoHundredAndThirtyFour().new ListNode(1);
        ListNode node1 = new TwoHundredAndThirtyFour().new ListNode(0);
        ListNode node2 = new TwoHundredAndThirtyFour().new ListNode(1);
        ListNode node3 = new TwoHundredAndThirtyFour().new ListNode(2);
        ListNode node4 = new TwoHundredAndThirtyFour().new ListNode(2);
        ListNode node5 = new TwoHundredAndThirtyFour().new ListNode(1);
        head.next = node1;
        node1.next = node2;
        /*node2.next = node3;
        node3.next = node4;
        node4.next = node5;*/
        System.out.println(isPalindrome(head));
    }
}
發佈了75 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章