给定一个链表的 头节点 head , 请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例 1:
输入: 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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。