方法一:判断是否回文链表,我们可以将链表的后半部分反转,然后比较链表前半部分的值和后半部分的值是否相等
class Solution {
public boolean isPalindrome(ListNode head) {
//判断头结点是否为空
if(head==null){
return true;
}
//指向链表头结点的指针
ListNode first=head;
//链表的中间节点
ListNode mid=getMid(head);
// 链表后半部分反转后的头结点
ListNode secondNode=reserve(mid);
// 指向链表后半部分反转后的头结点的指针
ListNode second=secondNode;
while(first!=mid&&second!=null){
//比较链表前半部分与反转后链表后半部分的值
if(first.val!=second.val){
//不同则返回false
return false;
}
//指针后移
first=first.next;
second=second.next;
}
//将反转后的链表后半部分恢复
mid=reserve(secondNode);
return true;
}
//利用快慢双指针找到链表的中间节点
public ListNode getMid(ListNode node){
ListNode fast=node;
ListNode slow=node;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
//链表的后半部分进行反转
public ListNode reserve(ListNode node){
ListNode pre=null;
ListNode next=null;
ListNode cur=node;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
方法二:判断是否回文链表,就是想链表的两端进行比较,看是否相等,但是由于链表无法操作尾结点,因此将链表中的元素存入到集合中,通过操作集合来判断回文。
class Solution {
public boolean isPalindrome(ListNode head) {
//定义一个集合用于存储链表中的元素
List<Integer> list=new ArrayList<>();
ListNode cur=head;
while(cur!=null){
//遍历链表,将链表中的元素存入到集合中
list.add(cur.val);
cur=cur.next;
}
//指向集合中第一个元素
int i=0;
//指向集合中第二个元素
int j=list.size()-1;
while(i<=j){
if(!list.get(i).equals(list.get(j))){
return false;
}
//两个指针同时向中间移动
i++;
j--;
}
return true;
}
}