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?
这道题如果只想完成是很简单的,但是像高效的完成就需要绕一点弯了。
使用快慢指针,一个走一步一个走两步,这样可以找到中间的那个节点,慢指针在走的时候同时把链表反向,这样找到中间节点的时候就可以一个往前一个往后逐一比较元素值是否相等了。
这里要注意的是什么时候停下正好停在中心节点,还有节点是奇数个和偶数个时的不同。
var isPalindrome = function(head) {
if (!head)
return true;
var pre = null;
var slow = head;
var fast = head;
while (fast&&fast.next) {
fast = fast.next.next;
var tamp = slow.next;
slow.next = pre;
pre = slow;
slow = tamp;
}
if (fast)
slow = slow.next;
while (slow&&slow.val===pre.val) {
slow = slow.next;
pre = pre.next;
}
return !slow;
};