题目
题目描述
请编写一个函数,检查链表是否为回文。
给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false
分析
回文链表的前半部分和后半部分是相反的,可引入栈解决
对于单链表的情况,引入快慢指针很有用
(1)快指针每次走两格,慢指针每次走一格,这样快指针到节点尾部,慢指针到中点
(2)把中点前部分的数字入栈,然后出栈和中点后部分的比较,看是否相等
(3)注意链表长度的奇偶
代码
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) {
/*
对于单链表的情况,引入快慢指针很有用
(1)快指针每次走两格,慢指针每次走一格,这样快指针到节点尾部,慢指针到中点
(2)把中点前部分的数字入栈,然后出栈和中点后部分的比较,看是否相等
(3)注意链表长度的奇偶
*/
if(pHead==null){
return true;
}
ListNode fast = pHead;
ListNode slow = pHead;
Stack<Integer> stack = new Stack<>();
stack.push(slow.val);
while(fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next.next;
stack.push(slow.val);
}
if(fast.next == null){ //节点个数为奇数
stack.pop(); //要把最中间的元素出栈
}
slow = slow.next;
while(!stack.isEmpty()){
if(stack.peek() != slow.val){
break;
}
stack.pop();
slow = slow.next;
}
if(stack.isEmpty()){
return true;
}
return false;
}
}