📅  最后修改于: 2023-12-03 14:49:44.067000             🧑  作者: Mango
在链表中查找最长回文列表长度是一道经典的算法问题,如果能够使用 O(1) 额外空间来实现,将会更具挑战性。下面我们将介绍如何实现这个算法。
判断回文列表的方法是,从中间节点开始,将前一段链表反转,然后再向两端遍历链表,依次比较两端节点的元素,如果节点元素一致,则继续向两端遍历,直到遇到元素不一致的位置。
/**
* @param {ListNode} head
* @return {number}
*/
var longestPalindrome = function(head) {
let slow = head, fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
let len = 0;
let p = reverseList(slow);
while (head && p) {
if (head.val === p.val) {
len++;
head = head.next;
p = p.next;
} else {
p = reverseList(slow); // 将反转链表恢复原样
len = 0;
slow = slow.next;
head = slow;
}
}
return len;
};
var reverseList = function(head) {
let pre = null, cur = head;
while (cur) {
const next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
};
本算法通过快慢指针的方式找到链表的中间节点,将后一段链表反转,并从中间节点开始向两端遍历链表,通过比较节点元素,实现了 O(1) 额外空间查找链表中最长回文列表长度的功能。