測試樣例:
1->2->2->1
返回:true
方法一:
思路:
1)第一步,找到中間節點
2) 第二步,逆置鏈表後半部分節點
3) 第三步,判斷鏈表是否是迴文結構
代碼如下:
import java.util.*;
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
if(A == null) {
return false;
}
if(A.next == null) {
return true;
}
//找到單鏈表的中間節點
ListNode fast = A;
ListNode slow = A;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
//反轉單鏈表
ListNode cur = slow.next;
while(cur != null) {
ListNode curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
//fast/slow/往前 head往後
while(slow != A){
if(A.val!=slow.val) {
return false;
}
if(A.next == slow) {
return true;
}
slow = slow.next;
A = A.next;
}
return true;
}
}
方法二:
思路:
利用額外空間,定義一個長度相同數組保存鏈表的數據,判斷數組迴文。
代碼如下:
import java.util.*;
//利用額外空間
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
ListNode p = A; //指向表頭
int len = 0; //記錄表長
while(p != null){
len ++;
p = p.next;
}
//定義一個長度相同數組保存鏈表的數據
int[] a = new int[len];
for(int i=0; i<len; i++){
a[i] = A.val;
A = A.next;
}
//轉化爲判斷數組迴文
for(int i=0; i<len/2; i++){
if(a[i] != a[len-1-i]){
return false;
}
}
return true;
}
}