1. 程式人生 > >連結串列例題6:檢查連結串列中的資料是否迴文

連結串列例題6:檢查連結串列中的資料是否迴文

  首先需要用到快慢指標的思想,中間需要棧的一些幫助就可以完成此題。

  建立一個快慢指標分別為:fast,slow;開始時他們都指向連結串列的第一個資料結點,使用一個while迴圈快指標指向為null時結束,設定快指標一次兩步,慢指標一次一步,這樣當快指標指向為null時,慢指標指向的這個連結串列的中心地帶,但是這時要注意這個迴文的資料個數是為奇還是為偶的問題(因為如果為偶的話則慢指標剛好指的是右邊那段資料的第一個結點,而當個數為奇數的時候慢指標指向的是中間那個分界的結點,這個結點是不需要比較的,所以慢指標需要單獨向後移動一步),在while的過程中還需要把慢指標前面的部分依次的push進一個棧中,以便後序的比較使用。最後在棧這邊出棧,slow這邊往後移就,這樣一步一步的比較。

  

程式碼如下:

 1 import java.util.Stack;
 2 
 3 class LinkedList{
 4     Object data;
 5     LinkedList next;
 6     
 7     public LinkedList(Object data) {
 8         this.data=data;
 9     }
10 }
11 
12 public class PalindromeLinkedList {
13 
14     public static void main(String[] args) {
15         String s[]= {"a","b","c","c","b","a"}; 
16 LinkedList head=new LinkedList(null); 17 LinkedList p=head; 18 for(String n : s) 19 { 20 p.next=new LinkedList(n); 21 p=p.next; 22 } 23 24 System.out.print(palindrome(head.next)); 25 } 26 27 28 public static
boolean palindrome(LinkedList headNode) { 29 if(headNode==null) 30 return false; 31 32 LinkedList slow=headNode; //慢指標 33 LinkedList fast=headNode; //快指標 34 int i=1; //記錄是偶個結點還是奇個結點 35 Stack<Object> leftNode=new Stack<Object>(); 36 if(slow.next==null) 37 return false; 38 //進行資料壓棧與slow的移動 39 while(fast!=null) 40 { 41 if(fast.next==null) //有奇數個結點 42 { 43 slow=slow.next; 44 break; 45 } 46 leftNode.push(slow.data); 47 slow=slow.next; 48 fast=fast.next.next; 49 } 50 //進行比較 51 while(slow!=null) 52 { 53 if(leftNode.pop()!=slow.data) 54 return false; 55 slow=slow.next; 56 } 57 return true; 58 59 } 60 }