回文数字,是左边和右边对其相等。
将后半链表反转后与前半链表逐一比较,则就能判断出是回文链表。
1、用快慢节点来寻找出中间节点,fast走到末尾时候,slow为要找的位子。slow步幅为1,fast步幅为2
这里存在奇偶节点问题,用fast 或者 fast.next 为空可以判断
举例: 1 2 2 1 ,fast 从 1 走到 2 走到 null ,fast 为空 则为偶数链表
1 2 3 2 1 , fast 从 1 走到 3 走 1。 fast.next 为空 可以判断为奇数链表
位奇数链表时候,slow往后记录一个,2才是需要找的位子
2、将slow 开始以后的节点翻转
3、slow反转后与 head链表比较。直到 slow末尾,即比较完一半。
class Solution {
public boolean isPalindrome(ListNode head) {
if( head == null || head.next == null ) return true;
ListNode fast = head;
ListNode slow = head;
while( fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
if(fast == null) {//如果 fast == null空时候 这个链表为偶数链表,不作为。fast.next 为空的时候 为奇数链表,slow往后移动一个位子
}else{
slow = slow.next;
}
//如果后半链表长度不为1,则进行翻转,反转方法解释
// https://blog.csdn.net/zkhong07/article/details/101290073
if(slow.next != null) {
ListNode p = slow;
ListNode pre;
while(p.next != null) {
pre = slow; //记录旧的头节点位子
//将p的下一个节点作为头节点
slow = p.next;
p.next = p.next.next;
slow.next = pre;
}
}
//反转后 逐一比较, 直到slow到达末尾处,
while(slow != null) {
if(slow.val == head.val) {
slow = slow.next;
head = head.next;
}else {
return false;
}
}
return true;
}
}