1. 程式人生 > >判斷連結串列是否為迴文連結串列

判斷連結串列是否為迴文連結串列

1. 問題描述:

給出一個連結串列,判斷該連結串列是否為迴文連結串列

2. 解決的方法有兩種,一種是將連結串列進行翻轉(這裡可以使用遞迴來解決)然後翻轉後的後半部分與連結串列的前半部分進行比較來進行判斷,第二種是將先找到連結串列的中間位置,這裡可以使用快慢指標指標來進行,快指標一次走一步,慢指標一次走兩步,那麼等到快指標走到末尾的時候那麼慢指標的位置是連結串列的中間位置,在求出中間位置的時候對慢指標指向的元素進行壓棧,等到迴圈結束那麼堆疊裡面儲存的是連結串列的前半部分的元素,這裡需要注意的時候需要在迴圈中判斷連結串列的節點是奇數還是偶數,假如是奇數那麼慢指標應該再走一步,因為判斷迴文假如是奇數的節點的話中間那個元素是不用進行判斷的

最後進行出棧,將出棧的元素與連結串列後半部分的元素進行比較發現不同直接返回false,等到迴圈結束還沒有返回說明就是迴文連結串列返回true就可以了

這裡利用到的是棧這個資料結構和棧先進後出的特點,所以很巧妙地解決了比較的問題

3. 具體的程式碼如下:

import java.util.Stack;

public class Main{
    private static class ListNode{
        private ListNode next;
        int value;
        public ListNode(int value) {
            super();
            this.value = value;
        }
    }
    
    public static void main(String[] args) {
        ListNode node = new ListNode(1);
        node.next = new ListNode(2);
        node.next.next = new ListNode(3);
        node.next.next.next = new ListNode(2);
        node.next.next.next.next = new ListNode(1);
        node.next.next.next.next.next = new ListNode(5);
        ListNode p = node;
        while(p != null){
            System.out.print(p.value + " ");
            p = p.next;
        }
        System.out.print("\n");
        boolean res = plalinDromeLinkedList(node);
        System.out.println(res);
    }

    private static boolean plalinDromeLinkedList(ListNode node) {
        ListNode slow = node;
        ListNode fast = node;
        boolean isOdd = true;
        Stack<Integer> stack = new Stack<>();
        while(fast != null && fast.next != null){
            stack.push(slow.value);
            slow = slow.next;
            fast = fast.next.next;
            if(fast == null){
                isOdd = false;
            }
        }
        //假如是奇數慢指標需要再走一步
        if(isOdd) slow = slow.next;
        while(!stack.isEmpty()){
            //出棧
            if(stack.pop() != slow.value){
                return false;
            }
            slow = slow.next;
        }
        return true;
    }
}