演算法面試之迴文連結串列判斷
阿新 • • 發佈:2019-02-19
簡介
【題目】
判斷一個連結串列是否為迴文結構
給定一個連結串列的頭節點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; } }