秦皇岛网站建设服务宁远做网站msoer

张小明 2025/12/30 6:35:22
秦皇岛网站建设服务,宁远做网站msoer,网站有了如何做推广,网页设计平均工资问题描述 给定一个单链表的头节点 head#xff0c;判断该链表是否为回文链表。如果是#xff0c;返回 true#xff1b;否则#xff0c;返回 false。 示例 #xff1a; 输入: head [1,2,2,1] 输出: true输入: head [1,2] 输出: false 进阶#xff1a; 你能否用 O(n)…问题描述给定一个单链表的头节点head判断该链表是否为回文链表。如果是返回true否则返回false。示例 输入: head [1,2,2,1] 输出: true输入: head [1,2] 输出: false进阶你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题解法一反转后半部分链表最优解这是面试中最常考的方法时间复杂度 O(n)空间复杂度 O(1)。算法步骤使用快慢指针找到链表的中间节点反转链表的后半部分比较前半部分和反转后的后半部分恢复链表可选代码实现class Solution { public boolean isPalindrome(ListNode head) { if(headnull||head.nextnull){ return true; } ListNode midFind_mid(head); ListNode head2reverse_List(mid); while(head2!null){ if(head.val!head2.val){ return false; } headhead.next; head2head2.next; } return true; } private ListNode reverse_List(ListNode head){//反转链表 ListNode prenull; ListNode curhead; while(cur!null){ ListNode Tempcur.next; cur.nextpre; precur; curTemp; } return pre; } private ListNode Find_mid(ListNode head){//找到中间节点 ListNode slowhead; ListNode fasthead; while(fast!nullfast.next ! null){ slowslow.next; fastfast.next.next; } return slow; } }关键点分析快慢指针找中点慢指针每次走一步快指针每次走两步当快指针到达末尾时慢指针正好在中点对于奇数长度链表慢指针停在中间节点对于偶数长度链表慢指针停在中间两个节点的第二个反转链表使用三个指针pre、curr、Tempcur指向prepre往前移cur往前移每次迭代将当前节点的next指向前一个节点时间复杂度与空间复杂度时间复杂度O(n)找中点O(n/2) ≈ O(n)反转后半部分O(n/2) ≈ O(n)比较两部分O(n/2) ≈ O(n)总时间O(n)空间复杂度O(1)只使用了常数级别的额外空间解法二使用栈思路利用栈的后进先出特性将链表元素入栈然后依次出栈与链表比较。代码实现javaclass Solution { public boolean isPalindrome(ListNode head) { if (head null || head.next null) { return true; } StackInteger stack new Stack(); ListNode current head; // 将链表值压入栈中 while (current ! null) { stack.push(current.val); current current.next; } // 比较栈顶元素和链表当前值 current head; while (current ! null) { if (current.val ! stack.pop()) { return false; } current current.next; } return true; } }复杂度分析时间复杂度O(n)需要遍历链表两次空间复杂度O(n)需要额外栈空间解法三递归思路利用递归的调用栈从链表末尾开始比较。代码实现javaclass Solution { private ListNode frontPointer; public boolean isPalindrome(ListNode head) { frontPointer head; return recursivelyCheck(head); } private boolean recursivelyCheck(ListNode currentNode) { if (currentNode ! null) { // 递归到链表末尾 if (!recursivelyCheck(currentNode.next)) { return false; } // 比较当前节点值和前端指针的值 if (currentNode.val ! frontPointer.val) { return false; } // 前端指针向后移动 frontPointer frontPointer.next; } return true; } }复杂度分析时间复杂度O(n)需要递归遍历整个链表空间复杂度O(n)递归调用栈的空间解法四复制到数组 双指针思路将链表值复制到数组中然后使用双指针判断数组是否为回文。代码实现javaclass Solution { public boolean isPalindrome(ListNode head) { // 将链表值复制到数组中 ListInteger values new ArrayList(); ListNode current head; while (current ! null) { values.add(current.val); current current.next; } // 使用双指针判断数组是否为回文 int left 0; int right values.size() - 1; while (left right) { if (!values.get(left).equals(values.get(right))) { return false; } left; right--; } return true; } }复杂度分析时间复杂度O(n)复制到数组O(n)双指针比较O(n/2) ≈ O(n)空间复杂度O(n)需要额外数组存储链表值常见错误与注意事项错误1没有处理奇偶长度差异java// 错误示例没有考虑奇偶长度差异 private ListNode findMiddle(ListNode head) { ListNode slow head; ListNode fast head; while (fast ! null) { // 错误应该检查fast.next slow slow.next; fast fast.next.next; } return slow; }修正javaprivate ListNode findMiddle(ListNode head) { ListNode slow head; ListNode fast head; while (fast ! null fast.next ! null) { slow slow.next; fast fast.next.next; } return slow; }错误2反转链表实现错误修正javaprivate ListNode reverseList(ListNode head) { ListNode pre null; ListNode cur head; while (cur ! null) { ListNode temp cur.next; cur.next pre; pre cur; cur temp; } return pre; }扩展如果要恢复链表怎么办如果需要保持链表原样可以在比较后再次反转恢复javaclass Solution { public boolean isPalindrome(ListNode head) { if (head null || head.next null) return true; // 找到中点 ListNode slow head, fast head; while (fast ! null fast.next ! null) { slow slow.next; fast fast.next.next; } // 反转后半部分 ListNode secondHalf reverseList(slow); // 比较 ListNode p1 head, p2 secondHalf; boolean result true; while (p2 ! null) { if (p1.val ! p2.val) { result false; break; } p1 p1.next; p2 p2.next; } // 恢复链表 reverseList(secondHalf); return result; } private ListNode reverseList(ListNode head) { ListNode prev null, curr head; while (curr ! null) { ListNode nextTemp curr.next; curr.next prev; prev curr; curr nextTemp; } return prev; } }总结方法时间复杂度空间复杂度优点缺点反转后半部分O(n)O(1)空间最优满足进阶要求修改了原链表结构使用栈O(n)O(n)实现简单不修改原链表需要额外空间递归O(n)O(n)代码简洁递归深度可能较大复制到数组O(n)O(n)实现简单需要额外空间推荐使用反转后半部分链表的方法因为空间复杂度为 O(1)满足进阶要求时间复杂度为 O(n)性能良好是面试中最常考的解法相关题目反转链表基础中的基础必须掌握链表的中间结点快慢指针的经典应用回文数字类似的回文判断问题回文字符串字符串版本的回文判断掌握这道题的关键在于理解快慢指针和链表反转这两个核心技巧这两个技巧在链表相关题目中非常常见。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站苏州南昌做网站市场报价

摘要 随着信息技术的快速发展,企业客户管理系统的需求日益增长。传统客户管理方式依赖人工记录和纸质档案,效率低下且易出错,难以满足现代企业对数据实时性和精准性的要求。客户关系管理(CRM)系统的引入成为企业提升客…

张小明 2025/12/30 6:34:48 网站建设

做html网站模板有人知道网站怎么做吗

GitHub热门项目推荐:Stable Diffusion 3.5 FP8量化模型一键拉取指南 在生成式AI的浪潮中,图像创作正以前所未有的速度走向普及。从独立艺术家到大型设计团队,越来越多的人开始依赖文生图模型来加速创意流程。然而,一个现实问题始终…

张小明 2025/12/30 6:34:12 网站建设

婚姻网站建设注意事项seo搜索引擎优化实训报告

导语 【免费下载链接】smol-vision 项目地址: https://ai.gitcode.com/hf_mirrors/merve/smol-vision Smol Vision开源项目通过模型压缩、量化和优化技术,让原本需要高性能服务器的多模态AI模型能够在手机等边缘设备上高效运行,开启了轻量化智能…

张小明 2025/12/30 6:33:36 网站建设

北京网站制作与营销培训网站建设 地址 上海石门二路

还在为看不清自己的操作频率而烦恼吗?想要精准掌握键盘和鼠标的使用习惯吗?KeysPerSecond就是你的理想选择!这款专业的按键监控工具能够实时追踪你的每一个按键动作,为你提供精确到秒的数据分析。无论你是游戏玩家、程序员还是数据…

张小明 2025/12/30 6:32:59 网站建设

小型网站建设步骤上海集团有限公司

Transformer模型推理优化实战:基于TensorRT镜像的全流程教程 在大模型落地越来越普遍的今天,一个常见的尴尬场景是:训练好的Transformer模型放进生产环境,一跑起来延迟高、吞吐低,GPU显存爆满,QPS上不去——…

张小明 2025/12/30 6:32:22 网站建设

jquery 动画网站成品软件十大免费

从零搞定STLink驱动安装:新手也能轻松上手的实战指南 你是不是也遇到过这种情况——刚拿到一块STM32开发板,兴冲冲地插上STLink调试器,结果设备管理器里却显示“未知设备”?或者IDE提示“STLink not connected”,翻遍…

张小明 2025/12/30 6:31:11 网站建设