回文是指从前往后读和从后往前读是一样的,这样有两种情况:
偶数个:baccab
奇数个:bacab
因此需要考虑两种情况,找到中心,再反向遍历。
而链表中找中心的办法通常是采用快慢指针,快指针走两步,慢指针走一步。(快慢指针还可以用在寻找最小找交叉节点)
/*** Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//需要保存三个节点,当前节点p,前一个节点pre,下一个节点q。
//尾节点wei即为下一节点为空的位置
ListNode pre=null;//初始化的前一节点为null
ListNode p=head;
ListNode wei=null;
while(p!=null){
ListNode q=p.next;//保存当前节点的下一节点
if(q==null){
wei=p;
}
p.next=pre;
pre=p;
p=q;
}
return wei;
}
public boolean isPalindrome(ListNode head) {
ListNode pfast=head;
ListNode pslow=head;
ListNode p=head;
ListNode q=head;
if(head==null||head.next==null) return true;
while(pfast.next!=null&&pfast.next.next!=null){
pfast=pfast.next.next;
pslow=pslow.next;//找中点,pslow当为偶数时为中点的靠前一个节点,为奇数是恰好为中点。
}
ListNode slow=pslow.next;//从slow的下一节点开始分两边比较。
boolean drome=true;
ListNode new_slow=reverseList(slow);
while(new_slow!=null){
if(q.val!=new_slow.val) {
drome=false;
break;
}
new_slow=new_slow.next;
q=q.next;
}
return drome;
}
}