news 2026/2/26 5:12:01

链表中的回文判断

作者头像

张小明

前端开发工程师

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/2/19 14:19:40

【time-rs】Duration 结构体详解

这是一个 Rust 时间库中的 Duration 结构体实现&#xff0c;提供高精度的时间跨度表示。 1. 主要特性 纳秒级精度&#xff1a;由整秒和纳秒部分组成支持负值&#xff1a;与标准库的 std::time::Duration 不同&#xff0c;支持负时间间隔安全边界检查&#xff1a;使用 RangedI32…

作者头像 李华
网站建设 2026/2/25 22:03:40

10398_基于SSM的教学评价管理系统

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料&#xff1b;带你从零开始部署运行本套系统。2、项目介绍教学评价系统是以Java平台作为开发环境&#xff0c;采用MySQL数据库作为后台&#xff0c;使用Eclipse作为开发工具进行设计。本系统主要实现了教学评价模块、…

作者头像 李华
网站建设 2026/2/14 21:05:17

Go语言变量

Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明&#xff0c;明确内存边界。Go作为静态语言&#xff0c;通过变量声明实现这一机制&#xff1a; 变量绑定特定内存区域&#xff0c;类型信息确定操作边界声明形式为&#xff1a;var 变量名 类型 值未显式初始化时自动…

作者头像 李华
网站建设 2026/2/8 19:52:39

【高可用系统架构】

系统高可用实现手段 冗余与无单点设计 部署关键节点时避免单点故障&#xff0c;例如负载均衡采用双节点Keepalived方案&#xff08;如Nginx/HAProxy/LVS&#xff09;&#xff0c;通过虚拟IP实现故障自动切换。网络通信配置多线路&#xff08;如移动电信双线&#xff09;&#x…

作者头像 李华
网站建设 2026/2/24 9:01:46

高频软件测试基础面试题

在软件测试的面试过程中&#xff0c;面试官会问些基础的软件测试知识&#xff0c;下面为大家整理了一些高频软件测试面试必备的基础题&#xff0c;拿走不谢~ 一、什么是软件测试 为了发现程序中的错误而执行程序的过程。 二、软件测试的原则 1、完全测试程序是不可能的 2、…

作者头像 李华
网站建设 2026/2/20 9:35:05

如何准确判断json文件并且拿到我想要的信息

写在前面&#xff0c;自从发现拿到json解析后的文件中有我们想要的信息后&#xff0c;我稍微有点迷上这种方法&#xff0c;但是拿到内容后要怎么拿到想要的信息呢&#xff0c;字典列表相互嵌套&#xff0c;我头都晕了方法&#xff1a;首先就是把json解析后的文本保存成.json的形…

作者头像 李华