题目本身比较简单,主要是快慢指针的思路值得记一下,后续可能还会有其他应用。
public boolean isPalindrome(ListNode head) {
if (head.next == null)
return true;
ListNode fast = head;
ListNode slow = head;
ListNode preSlow = null, nextSlow;
// 通过快慢指针,找到链表的中间位置,同时翻转前半部分
while (fast != null && fast.next != null) {
nextSlow = slow.next; // 一边走一边翻转
slow.next = preSlow;
preSlow = slow;
slow = nextSlow; // 满指针一次走一个节点
fast = fast.next.next; // 快指针一次走两个节点
}
// 判断链表长度的奇偶
if (fast == null)
fast = slow; // 偶数情况
else
fast = slow.next; // 奇数情况
slow = preSlow;
return equal(slow, fast);
}
public boolean equal(ListNode l1, ListNode l2) {
while (l1 != null && l2 != null) {
if (l1.val != l2.val)
return false;
l1 = l1.next;
l2 = l2.next;
}
return true;
}