title: 234.palindrome-linked-list
date: 2021-10-13 16:31:14
tags:
- LeeCode
categories:
- LeeCode
hidden: true
Given the head of a singly linked list, return true if it is a palindrome.
判断一个链表是否为回文链表。
将链表回文判断转化成数组回文判断。
//** 解法1:暴力解法,转成数组的回文判断 **//
var isPalindrome = function(head) {
// 暴力,转成数组的回文判断
if(!head.next) return true;
let nums = [], len = 0;
while(head) {
nums.push(head.val);
head = head.next;
len++;
}
console.log(nums);
for(let i = 0; i < len / 2; i++) {
if(nums[i] !== nums[len - i - 1]) return false;
}
return true;
};
翻转链表前半段,并将链表前半段和后半段进行比较。
var isPalindrome = function(head) {
// q: 快指针移动2格,p: 慢指针移动1格
// q的速度是p的两倍,所以q到达链表末尾时,p到达链表中间
// 在p的移动过程中对前半段链表进行反转
if(!head.next) return true;
let q = head, p = head, pre = null;
let flag = 1; // 链表奇偶
while(q.next) {
q = q.next;
if(q.next) {
// 再次移动1格
q = q.next;
pre = p.next;
p.next = p.next.next;
pre.next = head;
head = pre;
} else {
// 当前链表为偶数
flag = 0;
}
}
console.log(head)
// 对比前半段和后半段
// 尾指针指向链表后半截起始处
q = p.next;
// 如果是奇数,从头节点下一个开始比较
p = flag ? head.next : head;
while(q) {
if(q.val !== p.val) return false;
q = q.next;
p = p.next;
}
return true;
};