将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

news/2024/4/18 10:44:03/文章来源:https://blog.csdn.net/weixin_43988251/article/details/128428944

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式

例如 1 -> 3 -> 5-> 3 -> 7 按照value = 3划分 1-> 3-> 3 -> 5 -> 7

解题思路:给定值为 value

  1. 用6个变量,分别表示 小于value 的Head sH ,小于 value 的Tail sT ,等于value 的Head eH ,等于value 的Tail eT,大于value 的Head hH, 大于value的Tail hT

  2. 遍历 list链表

  3. 对于每一个值与value 做比较

  4. 在某一个区间内 ,例如 大于区间

    1. 如果 hH == null 说明 大于区间还没有数字,hH 和hT 全部指向当前这个节点
    2. 如果hH != null 说明已经有值了 , 移动 尾部hT 节点指向当前的节点
  5. 最后把三个区域进行连接即可

要点:

  1. 每一个区域组成的都是一个链表 ,从head 到tail
  2. 每个区域添加节点的时候,要把当前节点的 next 节点变为null ,否则当前节点的next 节点会影响链表的结果 例如 1 -> 2-> 3 value = 3 在 1节点的时候 ,1要放在小于区域, 如果不把 next节点置 null ,那么 sH 和 sT 等于的就是 1 -> 2-> 3 ,而不是 1
  3. next置空之前,要记录next 节点,要不然next节点会丢失
  4. 最后连接的时候,有可能某一个区域没有节点(尾节点为null),这是跳过这个区域连接即可
public static Node getPartitionNode(Node head, int value) {Node sH = null;Node sT = null;Node eH = null;Node eT = null;Node hH = null;Node hT = null;Node next = null;while (head != null) {next = head.next;head.next = null;if (head.value < value) {if (sH == null) {sH = head;sT = head;} else {sT.next = head;sT = sT.next;}} else if (head.value == value) {if (eH == null) {eH = head;eT = head;} else {eT.next = head;eT = eT.next;}} else {if (hH == null) {hH = head;hT = head;} else {hT.next = head;hT = hT.next;}}head = next;}if (sT != null) {sT.next = eH;// eT 如果不是空 用 eT去连接 ,是空  用sT 去连eT = eT == null ? sT : eT;}if (eT != null) {eT.next = hH;}return sH == null ? (eH == null ? hH : eH) : sH;
}

img

给定一个单链表,判断单链表的值是否是回文结构

可以将所有数存到栈中(得到链表逆序),在遍历链表(链表正序),每一次栈弹出一个,验证链表的正序和逆序是否相等 这个解法不好,因为使用了一个栈的额外空间

  1. 通过快慢指针,快指针走到链表结尾时,慢指针到中心点位置
  2. 通过慢指针和快指针逆序后半部分链表的指针形成一个 1 -> 2 -> 3 <- 3<- 2 <- 1 的链表形式
  3. 从链表两端分别遍历,每个值比较判断是否相等
  4. 最后链表重新恢复原来的结构

只是用了有限几个变量,空间复杂度从 O(N) 变为 O(1)

要点:

  1. 找中点时,有可能快指针指向的不是最后一个节点,是倒数第二个,但是无所谓,只要中点找到了就可以
  2. 找到中点后,要记住中点的下一个节点,根据中点切割成两个链表

找链表中点图示

img

public static boolean isPalindromeList(Node head){if (head == null || head.next == null){return true;}Node low = head;Node fast = head;while (fast.next != null && fast.next.next != null){fast = fast.next.next;low = low.next;}// 分隔开个链表fast = low.next;low.next = null;Node temp ;while (fast != null){temp = fast.next;// 直接使用low 相当于pre节点fast.next = low;low = fast;fast = temp;}temp = low; //保存下最后一个节点,最后链表要还原fast = head;boolean res = true;while (low != null && fast != null){if (low.value != fast.value){res = false;break;}low = low.next;fast = fast.next;}// 还原fast = temp;low = null;while (fast != null){temp = fast.next;fast.next = low;low = fast;fast = temp;}return res;
}
public static boolean isPalindromeListForStack(Node head){if (head == null || head.next == null){return true;}Stack<Integer> stack = new Stack<>();Node cur = head;while (cur != null){stack.add(cur.value);cur = cur.next;}boolean res = true;cur = head;while (!stack.isEmpty() && cur != null){if(cur.value != stack.pop()){res = false;break;}cur = cur.next;}return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_239673.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第11章_数据库的设计规范(理论了解)

第11章_数据库的设计规范 范式 2.3键和相关属性的概念 范式的定义会使用到主键和候选键&#xff0c;数据库中的键(Key)由一个或者多个属性组成。数据表中常用的几种键和属性的定义: 超键︰能唯─标识元组的属性集叫做超键。候选键︰如果超键不包括多余的属性&#xff0c;那…

WEB1.0起源:全球首个网站info.cern.ch

伯纳斯李&#xff08;图&#xff09;1990年创立第一个网站。 info.cern.ch是世上第一个网站&#xff0c;提供有关万维网的资料。 info.cern.ch这个网站依然运作如常。 英国科学家蒂姆伯纳斯-李 (Tim Berners-Lee) 于 1989 年在 CERN 工作期间发明了万维网 (WWW)。Web 最初的构思…

mqtt的使用与二次封装

前提&#xff1a;先安装Mosquitto并启动服务&#xff0c;可使用mqttx进行接收发送的测试。 Mosquitto以配置启动命令 mosquitto -c mosquitto.conf -v原文链接&#xff1a;mqtt的使用 本文为测试使用固无账号密码&#xff0c;可在原文查看 封装后实现效果&#xff0c;加入一个…

耗时二周,万字总结Maven简明教程,与君共勉!

什么是Mavne Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a;Project Object Model)&#xff0c;一组标准集合。由于 Maven 使用标准目录布局和默认构建生命周期&#xff0c;开发团队几乎可以立即自动化项目的构建基础设施。在多个开发团队环…

消息队列RabbitMQ学习笔记(四)死信队列和延迟队列

1. 死信的概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理 解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到queue 里了&#xff0c;consumer 从 queue 取出消息 进行…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵&#xff1a;2.描点&#xff08;显示字符函数&#xff09;&#xff1a;3. 要打开LCD设备&#xff1a;4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址&#xff1a;6.清屏并显示字符&#xff1a;二、显示汉字1.区位码&…

多线程基础入门

文章目录前言一、认识线程&#xff08;一&#xff09;概念1.线程是什么2.为啥要有线程&#xff08;轻量级进程&#xff09;为什么线程比进程更轻量经典面试题&#xff1a;谈谈进程和线程的区别和联系3.线程的结构&#xff08;二&#xff09;第一个多线程程序&#xff08;三&…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析&#xff0c;实现用电监控、推行阶梯定价、负荷管理、线损分析&#xff0c;最终达到自动抄表、错峰用电、用电检查&#xff08;防窃电&#xff09;、负荷预测和节约用电成本等目的。建立全面的用户用电…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 4.5 工作模式总结

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.4 Topic 通配符模式4.4.1 模式说明4.4.2 代码编写4.4.3 小结4.5 工作模式总结第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 …

32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

今年的大环境不佳&#xff0c;所以大部分的人在今年的招聘旺季都没有收获到好的结果。 但不要着急&#xff0c;今天分享的内容则是由 一位阿里P7的面试心得&#xff0c;通过32天的高效突击训练&#xff0c;成功拿下offer的学习方法。 篇章分为三大章节&#xff0c;可以根据自…

day 10 模拟和高精度

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 #include<bits/stdc.h> using namespace std; int n, na, nb, fa, fb;//f:得分 int a[205], b[205];void fun(int ta, int tb){if(ta 0 && tb 1) fb;if(ta 1 && tb 0) fa;if(ta 0 && tb …

【nowcoder】笔试强训Day2

目录 一、选择题 二、编程题 2.1排序子序列 2.2倒置字符串 一、选择题 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 1. A a0new A(); 2. A a1new B(); 3. A a2new C(); 问以下哪个说法是正确的&#xff08;&…

机器学习 | 线性回归

一.基本原理 利用回归方程&#xff08;函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#xff09;之间关系进行建模的一种分析方式 根据线性代数&#xff0c;我们可以定义方程 xwy&#xff0c;在线性回归问题中&#xff0c;x…

前端小知识:赋予变量默认值(逻辑与运算符、空值合并运算符、逻辑空运算符)

8. 逻辑与运算符、空值合并运算符、逻辑空运算符&#xff08;可用赋予默认值&#xff09; &#xff08;空值合并运算符&#xff09;官方文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing   &#xff08;逻辑…

【推荐收藏】这份图解算法数据结构的材料太良心

5年前发生的一件事&#xff0c;成为了我职业生涯的重要转折点。当时的我在交大读研&#xff0c;对互联网求职一无所知&#xff0c;但仍然硬着头皮申请了 Microsoft 实习生。面试官让我在白板上写出“快速排序”代码&#xff0c;我畏畏缩缩地写了一个“冒泡排序”&#xff0c;并…

1754. 构造字典序最大的合并字符串

摘要 1754. 构造字典序最大的合并字符串 一 贪心算法分析 题目要求合并两个字符串 word1 与 word2&#xff0c;且要求合并后的字符串字典序最大。首先需要观察一下合并的选择规律&#xff0c;假设当前需要从 word1​ 的第 i 个字符和 word2​ 的第 j个字符选择一个字符加入到…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

内容资产管理11问

&#x1f447;点击一键关注主笔&#xff1a;邹小困、邝晴岚主持人&#xff1a;增长黑盒分析师Emma出品&#xff1a;增长黑盒研究组前言在这个信息爆炸的数据时代&#xff0c;各个行业正积极推进数字化转型&#xff0c;产业升级与技术赋能成为主题之一。在推进企业线上线下融合的…

最近面试遇到一个算法题,简单写一点。

第⼀题&#xff08;必答&#xff09; 请针对有重复数字的数组设计⼀个快排算法&#xff0c;⽐如&#xff1a;[34, 34, 89, 1, 1, 20, 12]&#xff0c;排序后结果为 [89,34,34,20,12,1,1] 第⼆题&#xff08;必答&#xff09; 请利⽤Redis 实现⼀个通⽤分布式锁&#xff0c;并…

B+树 [数据结构与算法][Java]

B树 B树是B树的一种变形 我们通过一颗四阶B树来理解认识一下B树:(如下:) 我们其实从图上就可以看出B树和B树是有很多不同之处的 比如我们的B树中将叶子结点层的所有结点使用一个链表串联了起来B树中对于非叶子结点都是只是存储的索引(指针), 并没有存储关键字, 所以我们最终查…