求star

开源不易,喜欢请点个star吧

Ocean Han
352 字
2 分钟
Leetcode->回文链表
2022-07-11

题目#

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

img

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

示例 2:

img

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

提示:

  • 链表中节点数目在范围[1, 105]

  • 0 <= Node.val <= 9

解题:key:#

① 复制到数组中然后双端遍历#

/**
 * 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) {
    const arr = []
    while(head) {
        arr.push(head.val)
        head = head.next
    }
    for(let i=0,j=arr.length-1;i<j;i++,j--){
        if(arr[i] !== arr[j]){
            return false
        }
    }
    return true
};

② 递归(原理还是双指针)#

TIP

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

​ 递归处理节点的顺序是相反的,而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。

/**
 * 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}
 */

let frontPointer 
var check = (currentNode) => {
    if(currentNode !== null){
        if(!check(currentNode.next)){
            return false
        }
        if(currentNode.val !== frontPointer.val){
            return false
        }
        frontPointer = frontPointer.next
    }
    return true
}
var isPalindrome = function(head) {
    frontPointer = head
    return check(head)
};
Leetcode->回文链表
https://blog.oceanh.top/posts/algorithm/回文链表/
作者
Ocean Han
发布于
2022-07-11
许可协议
CC BY-NC-SA 4.0
最后修改时间
2024-08-10 10:08:49