当前位置: 首页 > news >正文

链表中的回文判断

给一个链表,判断这个链表是否为回文链表。能否使用O(1)的空间复杂度解决问题?

思路1:使用辅助空间,我们这里给出了使用动态数组作为检查表,给出了两种实现方式,但是这种实现方式效率不高。

​ public class ListNode { public int val; public ListNode next; public ListNode(int x) { this.val = x; this.next = null; } public static ListNode createList(int[] nums) { if(null == nums || 0 == nums.length) return null; ListNode head = new ListNode(nums[0]); ListNode needle = head; for(int i = 1; i < nums.length;++i) { ListNode node = new ListNode(nums[i]); needle.next = node; needle = needle.next; needle.next = null; } return head; } }
import java.util.ArrayList; import java.util.List; class Solution { public boolean isPalindrome(ListNode head) { if (null == head || null == head.next) return true; List<Integer> all = new ArrayList<Integer>(); while (head != null) { all.add(head.val); head = head.next; } for (int i = 0; i < all.size() / 2; ++i) { if ((int) all.get(i) != (int) all.get(all.size() - 1 - i)) return false; } return true; } public static void main(String[] args) { int[] nums1 = { 1, 2, 4, 2, 1 }; ListNode l1 = ListNode.createList(nums1); boolean result = new Solution().isPalindrome(l1); System.out.print(result); } }

思路2:使用O(1)空间复杂度,即需要的临时空间较少,且跟链表长度没有关系,我们这里给出了两种实现方式,实现思路相同。使用快慢指针,找到中间结点位置,一种是反转链表的前半部分;一种是反转链表的后半部分,反转后半部分更容易实现,效率也要高。

class Solution { public boolean isPalindrome(ListNode head) { if (null == head || null == head.next) return true; // 找中间位置开始 ListNode fast = head; ListNode faster = head; while (faster != null && faster.next != null) { fast = fast.next; faster = faster.next.next; } // 找中间位置结束 // 反转fast之前的所有元素 // pre指向当前结点的前驱,反转后第一个结点的后继 ListNode pre = null; // 指向当前遍历的结点 ListNode cur = head; while (cur != fast) { // 记录当前结点的下一个结点,否则执行下一条一句就丢了后面没有反转的剩余结点 ListNode next = cur.next; // 真正的反转,指针变化方向,因为链表最后一个结点的next为空,这也是为什么pre的初始值为null cur.next = pre; // 向后继续遍历剩余未反转的结点,pre和cur均要向后移动一位 pre = cur; cur = next; } // 到此,cur指向fast,而pre指向了最后一个被反转的结点,也就是新链表的头 // 比较元素值是否相同开始 // 链表元素个数为奇数个的情况 if (null != faster && null == faster.next)// odd fast = fast.next; // 比较反转后的[pre,fast)与[fast,tail]到链表尾部 while (pre != null && fast != null) { if (pre.val != fast.val) return false; pre = pre.next; fast = fast.next; } // 比较元素值是否相同结束 return true; } public static void main(String[] args) { int[] nums1 = { 1, 2, 4, 2, 1 }; ListNode l1 = ListNode.createList(nums1); boolean result = new Solution().isPalindrome(l1); System.out.print(result); } }
http://www.cnnetsun.cn/news/42632.html

相关文章:

  • 基于6种最新算法(小龙虾优化算法COA、MSA、RTH、NOA、BFO、SWO)求解机器人路径规划研究附Matlab代码
  • Golang实战:构建综合多头(逾期+反欺诈)风险查询的高性能客户端
  • 【TSP问题】基于蜣螂算法DBO和改进的蜣螂算法FADBO求解旅行商TSP问题(可根据自己的经纬度设置自己想要到达的地区)附Matlab代码
  • 【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析附Matlab代码
  • 数据结构:二叉排序树,平衡二叉树,红黑树的介绍
  • 软件复用的分类与实现
  • google服务
  • 进程PCB
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • 力扣hot100:搜索插入位置
  • Java冷启动全指南:从原理到实战优化
  • 测试 - 单元测试(JUnit)
  • C++中多态
  • c++经典练习题-多分支
  • qt为什么转向用cmake放弃qmake
  • 云屋音视频 SDK 凭何成为信创技术困局的 “破局者”?
  • 纯电动汽车动力经济性仿真:Cruise与Simulink联合仿真(2015版),包含BMS、再...
  • 【怎么理解maven中的镜像和仓库?】
  • comsol枝晶生长,沉积模型,包括:典型,形状成核,随机成核,均匀沉积,雪花晶形成过程。 适...
  • 终极指南:Qwen3-30B-A3B多GPU分布式推理完整解决方案
  • 腾讯混元语音驱动数字人技术:重塑动态视频生成新范式
  • 【MicroPython编程-ESP32篇】-Web页面显示DHT11传感器数据
  • DCDC电池模型:基于Matlab 2018b及以上的应用
  • Day 38 - Dataset 和 DataLoader
  • [C#][winform]基于yolov11的打架行为检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • 2022年TRC SCI1区TOP,基于随机分形搜索算法的多无人机四维航迹优化自适应冲突消解方法,深度解析+性能实测
  • 《智能世界2035》——华为预测十年以后智能世界的模样
  • FLAC3D随机裂隙建模:从基础到复杂网络
  • 终极指南:TUnit服务虚拟化测试实践