题目:
思路:先找出链表的中间结点,然后将中间结点之后的结点逆置,将逆置后的结点放在一个新链表中,将新链表中的元素与原链表中的元素比较,如果都相同,那就返回true,若有一个不同就返回false
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {//快引用走两步,慢引用走一步
public ListNode getMid(ListNode head){//找出链表的中间结点
ListNode fast=head;
ListNode slow=head;
while(fast!=null){
fast=fast.next;
if(fast==null){
break;
}
fast=fast.next;
slow=slow.next;
}
return slow;//中间结点
}
public ListNode reverse(ListNode head){//逆置中间结点之后的链表
ListNode result=null;
ListNode cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=result;
result=cur;
cur=next;
}
return result;//逆置后的链表
}
public boolean chkPalindrome(ListNode A) {
ListNode mid=getMid(A);//调用找中间那个结点的函数
ListNode h2=reverse(mid);//调用逆置函数
ListNode n1=A;
ListNode n2=h2;
while(n1!=null&&n2!=null){
if(n1.val!=n2.val){//不相等返回false
return false;
}
n1=n1.next;
n2=n2.next;
}
return true;//相等返回true
}
}