- 作者:老汪软件技巧
- 发表时间:2024-10-08 07:00
- 浏览量:
难度:简单
题目:
给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
解题思路:
要判断一个单链表是否为回文链表,我们可以采用以下步骤来实现:
找到中间节点:使用快慢指针法找到链表的中间节点。反转后半部分:将链表的后半部分反转。比较前后两部分:比较链表的前半部分和反转后的后半部分是否相同。JavaScript实现:
/**
* 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 slow = head, fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
// 反转后半部分链表
let prev = null;
let current = slow;
while (current) {
let next = current.next;
current.next = prev;
prev = current;
current = next;
}
// 比较前半部分和反转后的后半部分
let left = head;
let right = prev;
while (right) {
if (left.val !== right.val) {
return false;
}
left = left.next;
right = right.next;
}
return true;
};
// 示例
// const createLinkedList = (values) => {
// let dummyHead = new ListNode(0);
// let current = dummyHead;
// values.forEach(value => {
// current.next = new ListNode(value);
// current = current.next;
// });
// return dummyHead.next;
// };
// const list = createLinkedList([1, 2, 2, 1]);
// console.log(isPalindrome(list)); // 输出: true