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) {
ListNode p = A;//指向表头
int len = 0;//记录表长
while(p != null){
len ++;
p = p.next;
}
//定义一个长度相同数组保存链表的数据
int[] a = new int[len];
for(int i=0; i
a[i] = A.val;
A = A.next;
}
//转化为判断数组回文
for(int i=0; i
if(a[i] != a[len-1-i]){
return false;
}
}
return true;
}
}
//方法二:由于不允许利用额外空间,先找到中间结点,再把中间结点后的链表逆置,再依次比较结点是否相等
import java.util.*;
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
ListNode fast = A;//都指向头结点
ListNode slow = A;
//找mid结点
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
ListNode nextMid = slow.next;//mid的下一个结点
slow.next = null;//断链
ListNode pre = null;//标记逆置后的表头
ListNode next = null;
//逆置
while(nextMid != null){
next = nextMid.next;
nextMid.next = pre;
pre = nextMid;
nextMid = next;
}
//依次比较两链表
while(A != null && pre != null){
if(A.val != pre.val){
return false;
}
A = A.next;
pre = pre.next;
}
return true;
}
}