题解 | #牛群编号的回文顺序II#

题目考察的知识点

从题目考察的知识点来看,这是一道关于链表的题目,要求判断链表中牛的编号顺序是否为回文。如果是回文,则返回一个空链表;如果不是回文,则需要找到最大连续回文子链表的头节点。

题目解答方法的文字分析

在代码的实现上,首先需要定义一个辅助函数expandAroundCenter,用于以指定节点为中心向两侧扩展回文子链表的长度。然后,通过遍历链表,以每个节点为中心调用expandAroundCenter函数,找到最大回文子链表的起始节点和结束节点,并记录最大回文子链表的长度。最后,根据题目要求进行处理:如果整个链表是回文,则返回空链表;如果不是回文,则断开最大回文子链表之前的连接。

本题解析所用的编程语言

本题解析使用了JavaScript作为编程语言进行示例代码的展示。JavaScript是一种流行的脚本语言,广泛应用于前端开发和服务器端开发。

完整且正确的编程代码

function maxPalindrome(head) {
    // write code here
    if (head === null) return null;
    let curr = head;
    const arr = [];
    while (curr !== null) {
        arr.push(curr.val);
        curr = curr.next;
    }
    let l = 0,
        r = arr.length - 1;
    let isPalindrome = true;
    while (l <= r) {
        if (arr[l] !== arr[r]) {
            isPalindrome = false;
            break;
        }
        l++;
        r--;
    }
    if (isPalindrome) return null;

    let count = 0;
    let left = 0;
    let right = 0;
    for (let i = 1; i < arr.length; i++) {
        let [l1, r1, currLen1] = aroundCenter(arr, i, i);
        let [l2, r2, currLen2] = aroundCenter(arr, i - 1, i);
        const currMaxLen = Math.max(currLen1, currLen2);
        if (count < currMaxLen) {
            count = currMaxLen;
            left = currMaxLen === currLen1 ? l1 : l2;
            right = currMaxLen === currLen1 ? r1 : r2;
        }
    }
    curr = head;
    let leftBound = 0;
    while (leftBound < left) {
        curr = curr.next;
        leftBound++;
    }
    const result = curr;
    while (left < right) {
        curr = curr.next;
        left++;
    }
    curr.next = null;
    return result;
}

function aroundCenter(arr, i, j) {
    while (i >= 0 && j < arr.length && arr[i] === arr[j]) {
        i--;
        j++;
    }
    return [i + 1, j - 1, j - i - 1];
}
#面试高频TOP202#
题解 | 前端刷题 文章被收录于专栏

题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务