LeetCode Hot100刷题记录-234.回文链表
题目:给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表
。如果是,返回 true ;否则,返回 false 。
PS: 回文 序列是向前和向后读都相同的序列。
解题思路:
遍历链表,将每个元素存放入一个新的数组中。遍历完成后,再用两个指针前后遍历数组来判断两个数字是否相等。
/**
* 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) {
const arr = new Array();
while(head) {
arr.push(head.val);
head = head.next;
}
let i = 0;
let j = arr.length - 1;
while(i < j){
if(arr[i] === arr[j]){
i++;
j--;
} else {
return false;
}
}
return true;
}
这样的时间复杂度和空间复杂度都为O(n)
。
可以尝试着把空间复杂度降到O(1):
不借助额外的数组,用双指针和原地修改链表的方法。我们将链表分成前后两个部分,反转后半部分的链表,然后通过双指针判断是否是回文。
思路:
使用快慢指针找到链表的中间节点。
反转后半部分的链表。
比较前半部分和后半部分的节点值。
恢复链表(可选,面试时有时候要求恢复原链表)。
var isPalindrome = function(head) {
if(!head || !head.next) return true;
let slow = head;
let fast = head;
while(fast && fast.next){
slow = slow.next;
fast = fast.next.next;
}
let reversedHalf = reverse(slow);
let oriHalf = head;
while(reversedHalf){
if(reversedHalf.val === oriHalf.val){
reversedHalf = reversedHalf.next;
oriHalf = oriHalf.next;
}else return false;
}
return true;
}
function reverse(head){
let prev = null;
let current = head;
while(current){
let next = current.next;
current.next = prev;
prev = current;
current = next;
}
return prev;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧