题解 | #牛群编号的回文顺序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#题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码