剑指 Offer II 027. 回文链表

66 阅读1分钟

给定一个链表的 头节点 head 请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

image.png

输入: head = [1,2,3,3,2,1]
输出: true

示例 2:

输入: head = [1,2]
输出: false

题解:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
// 方法一:以数组的形式头尾指针判断是否为回文链表
var isPalindrome = function (head) {
    let stack = [];
    while (head) {
        stack.push(head.val)
        head = head.next
    };
    for (let i = 0, j = stack.length - 1; i < j; ++i, --j) {
        if (stack[i] !== stack[j]) {
            return false;
        }
    }
    return true
}

// 方法二:递归  反向迭代节点 递归函数外的变量向前迭代
// currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。
// frontPointer 是递归函数外的指针。
// 若 currentNode.val != frontPointer.val 则返回 false。
// 反之,frontPointer 向前移动并返回 true。

let frontPointer
var isPalindrome = function (head) {
    frontPointer = head;
    return recursionFun(head)
}
const recursionFun = (currentNode) => {
    if (currentNode != null) {
        if (!recursionFun(currentNode.next)) {
            return false
        }
        if (currentNode.val !== frontPointer.val) {
            return false
        }
        frontPointer = frontPointer.next;
    }
    return true
}

来源:力扣(LeetCode)

链接:leetcode.cn/problems/aM…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。