1. 程式人生 > >演算法面試之迴文連結串列判斷

演算法面試之迴文連結串列判斷

簡介

【題目】

判斷一個連結串列是否為迴文結構

給定一個連結串列的頭節點head,請判斷該連結串列是否為迴文結構。 
例如: 
1->2->1,返回true。
1->2->2->1,返回true。
15->6->15,返回true。 
1->2->3,返回false。

【要求】

如果連結串列長度為N,時間複雜度達到O(N),額外空間複雜度達到O(1)

問題分析

找到連結串列的中間位置,將後半段逆序,與前半段逐個比對

程式碼實現

public class PalindromeList {
    public static void main(String[] args){
        Node n1=new Node(1);
        Node n2=new Node(2);
        Node n3=new Node(3);
        Node n4=new Node(2);
        Node n5=new Node(1);
        n1.next=n2;
        n2.next=n3;
        n3.next=n4;
        n4.next=n5;
        System.out.println(isPalindrome(n1));

//        Node n5=new Node(1);
//        System.out.println(isPalindrome(n5));
    }

    //連結串列結點
    public static class Node{
        int data;
        Node next;

        public Node(int data) {
            this.data = data;
            this.next=null;
        }
    }

    //迴文判斷
    public static boolean isPalindrome(Node node){
        if(node==null){
            return false;
        }
        //利用快慢指標找到連結串列中間結點
        Node quick=node;
        Node low=node;
        while (quick.next!=null&&quick.next.next!=null){
            quick=quick.next.next;
            low=low.next;
        }
        //後半段逆序
        Node pre=reverseList(low);
        //進行比對
        while(node!=null&&pre!=null){
            if(node.data!=pre.data){
                return false;
            }
            node=node.next;
            pre=pre.next;
        }
        return true;
    }

    //逆序連結串列
    public static Node reverseList(Node low) {
        if(low==null){
            return null;
        }
        Node pre=null;
        Node next=null;
        while(low!=null){
            next=low.next;
            low.next=pre;
            pre=low;
            low=next;
        }
        return pre;
    }
}