如果头结点为空,链表为空,是回文链表。
定义两个指针,fast和slow,fast每次走两步,slow每次走一步。
如果链表中的结点数是奇数,
那么此时循环结束后,slow正好处于中间结点,fast!=null,
那么让slow再走一步,让slow到末尾结点的结点数等于中间结点之前的结点数。
逆置slow到末尾结点,然后再与前面的结点进行比较,若每一项都相等,则为回文链表。
public boolean isPalindrome(ListNode head) {
if(head==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) {
slow = slow.next;
}
ListNode pre = null;
while (slow!=null) {
ListNode tmp = slow.next;
slow.next = pre;
pre = slow;
slow = tmp;
}
while (head!=null&&pre!=null) {
if (head.val!=pre.val) {
return false;
}
head = head.next;
pre = pre.next;
}
return true;
}