Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2 Output: falseExample 2:
Input: 1->2->2->1 Output: true
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {boolean} */ var isPalindrome = function(head) { let slow = fast = head; let stack = []; while (fast && fast.next) { stack.push(slow.val); slow = slow.next; fast = fast.next.next; } if (fast) { slow = slow.next; } while (slow) { val = stack.pop(); if (val !== slow.val) { return false } slow = slow.next; } return true; };
Follow up:
Could you do it in O(n) time and O(1) space?
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {boolean} */ var isPalindrome = function(head) { let slow = fast = head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; } slow = reverse(slow); fast = head; while (slow) { if (slow.val !== fast.val) { return false } slow = slow.next; fast = fast.next; } return true; } var reverse = function (head) { let prev = null; while (head) { let next = head.next; head.next = prev; prev = head; head = next; } return prev; }