234. Palindrome Linked List

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {

    /**
     * @param ListNode $head
     * @return Boolean
     */
    function isPalindrome($head) {
        if ($head && $head->next == null){
            return true;
        }

        $fast = $head;
        $steps = 1;
        $reverse = null;
        while($head != null) {
            if ($fast === null || $fast->next === null) {
                if ($steps % 2 === 1) {
                    $head = $head->next;
                    $steps = 0;
                }
                if ($reverse->val !== $head->val) {
                    return false;
                }
                $reverse = $reverse->next;
                $head = $head->next;
            } else {
                // recode steps
                if ($fast->next->next ?? false) {
                    $steps += 2;
                } elseif ($fast->next) {
                    $steps += 1;
                }

                $fast = $fast->next->next ?? null;
                // reverse linked list
                $nextHead = $head->next;
                $head->next = $reverse;
                $reverse = $head;
                // slow pointer to next
                $head = $nextHead;
            }
        }

        return true;
    }
}

Last updated