1. 程式人生 > 實用技巧 >[面試經典程式設計題]3 單鏈表判斷是否迴文

[面試經典程式設計題]3 單鏈表判斷是否迴文

單鏈表判斷是否迴文

題目描述

思路

三個指標,分別n1,n2,n3;三個指標不斷往後移動。

1、總體思路

找到中間節點,然後把後半個連結串列反轉後與前半部分比較。

(注意:奇數個連結串列的話是從中點的後一個節點逆置;偶數個連結串列的話從中間連結串列的節點逆置)

2、問題是如何找到中間節點

使用快慢指標,兩指標一開始都指向head,那麼fast一次2步,slow一次1步,那麼fast走到最後的節點,slow剛好指向中間。

Java程式碼

方法1:

藉助快慢指標找到中間的節點,翻轉後比較前後兩半段

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        // 1 使用快慢指標找到連結串列的中間節點
        ListNode slow = A;
        ListNode fast = A;
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        
        //2 對後半段連結串列進行逆置操作
        ListNode reversed = reverse(slow);
        //3 比較判斷迴文
        while(reversed!=null && A!=null){
            if(reversed.val != A.val){
                return false;
            }else{
                reversed = reversed.next;
                A = A.next;
            }
        }
        //跳出while迴圈,表示比較完畢,返回是迴文
        return true;
    }
    
    //連結串列翻轉
    public ListNode reverse(ListNode A) {
        ListNode n0=null;
        ListNode n1=A;
        ListNode n2=A.next;
        while(n1!=null){
            //指向翻轉
            n1.next = n0;
            //指標賦值
            n0 = n1;
            n1 = n2;
            if(n2!=null){
                n2 = n2.next; //n2後移;存在最後一次n2已經為空的後移
            }
            
        }
        //返回n0
        return n0;
    }
}

輸出: