news 2026/7/7 12:25:21

链表中的回文判断

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表中的回文判断

给一个链表,判断这个链表是否为回文链表。能否使用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); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 14:51:19

征程 6P/H 计算平台部署指南

1.前言 本文旨在提供 征程 6H/P 计算平台的部署指南&#xff0c;将会从硬件、软件两部分进行介绍&#xff0c;本文整理了我们推荐的使用流程&#xff0c;和大家可能会用到的一些工具特性&#xff0c;以便于您更好地理解工具链。某个工具具体详 l 细的使用说明&#xff0c;还请…

作者头像 李华
网站建设 2026/7/7 9:30:56

F5-TTS语音合成模型:从零开始掌握配置与自定义加载

F5-TTS语音合成模型&#xff1a;从零开始掌握配置与自定义加载 【免费下载链接】F5-TTS Official code for "F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching" 项目地址: https://gitcode.com/gh_mirrors/f5/F5-TTS F5-TTS作…

作者头像 李华
网站建设 2026/7/7 11:01:13

【架构演进与选型分析 】

单体架构 电商初期采用单体架构&#xff0c;所有功能集中在一个应用内&#xff0c;代码分层明确&#xff08;表示层、业务层、数据访问层、DB层&#xff09;。适合业务简单、团队规模小的场景&#xff0c;但模块依赖模糊&#xff0c;多团队开发易冲突。例如早期淘宝和eBay因代码…

作者头像 李华
网站建设 2026/7/7 15:24:26

【WRF理论第二十期】湍流与扩散(Turbulence / Diffusion)

目录 湍流与扩散(Turbulence / Diffusion) 概念解释 数学表达式解析 扩散选项 diff_opt 的控制参数说明 km_opt 参数详解:湍流扩散系数计算方法 sfs_opt 参数详解:亚网格尺度(SGS)应力模型 六阶扩散参数 diff_6th_opt:六阶水平扩散选项 `diff_6th_factor`:六阶扩散强度…

作者头像 李华
网站建设 2026/7/7 5:17:45

挖漏洞一个月赚2万多,别被骗了!

有人说挖漏洞比上班挣的还多&#xff0c;也有人说靠挖漏洞赚钱得饿死&#xff0c;2025年挖漏洞到底还能不能行&#xff1f;新手如果想挖漏洞又该怎么上手&#xff1f;一篇文章告诉你。 首先先说2025年挖漏洞的前景如何&#xff1f; 众所周知挖漏洞的白帽子是越来越多了&#x…

作者头像 李华
网站建设 2026/7/7 6:04:48

Linux的权限

1. 怎么看权限&#xff1f; (ls -l)在终端输入 ls -l&#xff0c;你会看到类似下面的一行“天书”&#xff1a;Bashdrwxr-xr-x 2 user dev 4096 Dec 12 10:00 project/我们需要关注的是最前面的 10 个字符 drwxr-xr-x&#xff0c;它分为 4 个部分解读&#xff1a;字符位置…

作者头像 李华