题目描述
请编写一个函数,检查链表是否为回文。
给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Palindrome {
//思想:用快慢指针找到中间元素位置,同时将前半部分入栈,再从中间向两侧比较,即将栈顶元素和后面元素比较
public boolean isPalindrome(ListNode pHead) {
//快慢指针,找出链表中间元素,压入栈
ListNode slow=pHead;
ListNode fast=pHead;
Stack<Integer>stack=new Stack<>();
while (fast!=null&&fast.next!=null){
//入栈
stack.push(slow.val);
//快慢指针移动,慢指针依次走一步,快指针一次走两步,当快指针到达尾部,慢指针到达链表中间位置
slow=slow.next;
fast=fast.next.next;
}
//当链表长度为奇数时,跳过中间元素;如果是偶数,则不用跳过,直接比较即可
if(fast!=null){//fast==null时,是偶数
slow=slow.next;
}
//将后面元素和栈顶元素比较
while(slow!=null){
if(slow.val!=stack.pop()){
return false;
}else{
slow=slow.next;
}
}
return true;
}
}