[面試經典程式設計題]3 單鏈表判斷是否迴文
阿新 • • 發佈:2020-07-14
單鏈表判斷是否迴文
題目描述
思路
三個指標,分別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; } }
輸出: