思路:快指针走慢指针两倍 当快指针走到末尾,慢指针刚好走到中间,在走的过程中慢指针将前半段进行反转,然后再比较
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
ListNode pre = null;
ListNode slow = head;
ListNode fast = head;
ListNode temp = null;
while(fast != null && fast.next != null){
fast = fast.next.next; // 快指针走两步
temp = slow.next; // 记录
slow.next = pre; // 反转
pre = slow;
slow = temp; // 慢指针走一步
}
// 此处是为了区分奇数个和偶数个链表
if(fast != null){
slow = slow.next;
}
// 进行比较
while(slow != null && pre != null){
if(slow.val != pre.val){
return false;
}
pre = pre.next;
slow = slow.next;
}
return true;
}
}