Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
题目是想要判断一个链表的值是否满足回文条件。要求使用O(1)的空间复杂度可能是本题的难点。这就要求我们不能使用别得数据结构对链表的值进行保存在判断。所以我一开始就想能否使用链表翻转来实现,因为感觉这是唯一的突破口==但是如果对原始链表进行翻转,如果in-place则会丢失元链表,否则就会使用额外的存储空间。然后继续分析本题,会发现如果链表是回文,那么前半部分和后半部分一定是一样的。所以我肯可以将后半部分反转,然后再跟前半部分进行比较。这样效果是最好的。代码如下所示:
public static boolean isPalindrome1(ListNode head) {
ListNode fast=head, slow=head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
//如果链表长度为奇数
if(fast != null) slow = slow.next;
ListNode end=null, tmp;
while(slow != null){
tmp = slow.next;
slow.next = end;
end = slow;
slow = tmp;
}
while(end != null){
if(end.val != head.val)
return false;
end = end.next;
head = head.next;
}
return true;
}