难度:简单 日期:2023年6月5日
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
方法:快慢指针 + 翻转链表
思路:定义一个快指针 和 一个慢指针,快指针走两步,慢指针走一步。当快指针走到链表结尾时,慢指针刚好走到对称位置,将慢指针后面的链表反转。逐渐向右遍历,比较头指针head 和 慢指针,遇到不同时返回false,最后再将后面的链表反转
//翻转链表
const reverseList = (head) => {
let prev = null;
let curr = head;
while (curr !== null) {
let nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
var isPalindrome = function(head) {
let slow = head,fast = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
let p1 = head; //比较的前面部分指针
let p2 = reverseList(slow.next); //比较的后面部分指针
while(p2!=null && p1.val===p2.val){
p1 = p1.next;
p2 = p2.next;
}
if(p2 === null) return true;
return false;
};
结果