面试算法27:回文链表

news/2025/1/16 7:45:28/

问题

如何判断一个链表是不是回文?要求解法的时间复杂度是O(n),并且不得使用超过O(1)的辅助空间。如果一个链表是回文,那么链表的节点序列从前往后看和从后往前看是相同的。
在这里插入图片描述

分析

如果不考虑辅助空间的限制,直观的解法是创建一个新的链表,链表中节点的顺序和输入链表的节点顺序正好相反。如果新的链表和输入链表是相同的,那么输入链表就是一个回文链表。只是这种解法需要创建一个和输入链表长度相等的链表,因此需要O(n)的辅助空间。

仔细分析回文链表的特点以便找出更好的解法。回文链表的一个特性是对称性,也就是说,如果把链表分为前后两半,那么前半段链表反转之后与后半段链表是相同的。在如图4.13所示的包含6个节点的链表中,前半段链表的3个节点反转之后分别是3、2、1,后半段链表的3个节点也分别是3、2、1,因此它是一个回文链表。

链表的节点总数是偶数。如果链表的节点总数是奇数,那么把链表分成前后两半时不用包括中间节点。例如,一个链表中的节点顺序是1、2、k、2、1,前面两个节点反转之后是2、1,后面两个节点也是2、1,不管中间节点的值是什么该链表都是回文链表。

public class Test {public static void main(String[] args) {ListNode listNode1 = new ListNode(1);ListNode listNode2 = new ListNode(2);ListNode listNode3 = new ListNode(3);ListNode listNode11 = new ListNode(1);ListNode listNode22 = new ListNode(2);ListNode listNode33 = new ListNode(3);ListNode listNode4 = new ListNode(4);ListNode listNode5 = new ListNode(5);ListNode listNode6 = new ListNode(6);ListNode listNode7 = new ListNode(7);ListNode listNode8 = new ListNode(8);ListNode listNode9 = new ListNode(9);listNode1.next = listNode2;listNode2.next = listNode3;listNode3.next = listNode33;listNode33.next = listNode22;listNode22.next = listNode11;boolean result = isPalindrome(listNode1);System.out.println(result);}public static boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}ListNode slow = head;ListNode fast = head.next;// slow和fast按照两个两个的遍历下去,如果最后fast.next==null,则说明总个数是奇数while (fast.next != null && fast.next.next != null) {fast = fast.next.next;slow = slow.next;}ListNode secondHalf = slow.next;if (fast.next != null) {secondHalf = slow.next.next;}slow.next = null;return equals(secondHalf, reverseList(head));}private static boolean equals(ListNode head1, ListNode head2) {while (head1 != null && head2 != null) {if (head1.val != head2.val) {return false;}head1 = head1.next;head2 = head2.next;}return head1 == null && head2 == null;}public static ListNode reverseList(ListNode head) {ListNode prev = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = prev;prev = cur;cur = next;}return prev;}
}

http://www.ppmy.cn/news/1160370.html

相关文章

11-k8s-service网络

文章目录 一、网络相关资源介绍二、开启ipvs三、nginx网络示例四、pod之间的访问示例五、service反向代理示例 一、网络相关资源介绍 Servcie介绍 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现…

持续集成部署-k8s-资源调度:StatefulSet

持续集成部署-k8s-资源调度:StatefulSet 1. StatefulSet 简介2. 定义一个有状态服务3. 扩容缩容与滚动更新4. 删除更新5. 级联删除与非级联删除1. StatefulSet 简介 在 Kubernetes(K8s)中,StatefulSet是一种控制器对象,用于管理有状态应用程序的部署和扩展。与Deployment…

2023爱分析·中国大模型市场商业化进展研究报告|爱分析报告

大模型技术引领着人工智能领域迈入新发展高度,在世界范围内受到广泛关注。大模型对于企业用户和人工智能厂商而言,是一个重要发展机遇。 近期,爱分析观察到大模型已不局限于技术讨论的范畴,而是进入商业化应用阶段。因此&#xf…

conda使用一般步骤

Terminal:conda create --name myenv python3.7 如果环境不行的话 1.source /opt/anaconda3/bin/activate 2.可能是没有源 vim ~/.condarc将需要的源装上 conda clean -i将原先的源删除 3.然后再conda create即可 4.需要激活环境 conda activate numpy 5.pycharm配置…

软考高级系统架构论文 注意事项

目录 前言正文 前言 论文主要体现 分析问题的能力以及解决问题的能力 正文 论文必要的点: 虚构情节、文章中有较严重的不真实或者不可信的内容出现的论文;没有项目开发的实际经验、通篇都是浅层次纯理论的论文;所讨论的内容与方法过于陈|旧,或者项目…

c++ fstream 文件追加模式

目录 c 覆盖模式&#xff1a; c 追加模式&#xff1a; c 覆盖模式&#xff1a; #include <fstream>int main() {std::ofstream file("example.txt");if (file.is_open()) {file << "Hello, World!";file.close();}return 0; }在这个例子中&a…

基于matlab/simulink永磁直驱风力发电低电压穿越控制仿真模型

很久没更新了&#xff0c;下面继续更新电能质量治理这块的内容&#xff0c;今天分享的直驱式风力发电LVRT控制。 随着风力发电规模不断扩大&#xff0c;风电在电网系统中所占份额逐渐增加。当风电并网运行时&#xff0c;会发生很多种并网问题&#xff0c;其中最常见的问题之一就…

回顾 | E³CI效能认知与改进论坛,助力企业研发效能度量和提升

2023年8月&#xff0c;TiD质量竞争力大会组委会和ECI专家委员会成功举办TiD大时段课程“度量驱动研发效能提升”与“ECI效能认知与改进论坛”。与会专家以《ECI软件研发效能度量规范》团体标准为要点&#xff0c;为企业研发效能度量和提升分享诸多实践成果与经验。 《ECI软件研…