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

news2024/11/19 5:53:00

将单向链表按照目标值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.coloradmin.cn/o/112615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年天津中德应用技术大学专升本专业课考试具体安排及准考证

2023年天津中德应用技术大学高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 12月24日12点开始&#xff0c;专业课报名审核通过的考生&#xff0c;登录学校专业课报名系统&#xff08;114.115.135.236/jobgroup/f&#xff09;&#xff0c;点击“准考证”&#xf…

Qt之悬浮球菜单

一、概述 最近想做一个炫酷的悬浮式菜单&#xff0c;考虑到菜单展开和美观&#xff0c;所以考虑学习下Qt的动画系统和状态机内容&#xff0c;打开QtCreator的示例教程浏览了下&#xff0c;大致发现教程中2D Painting程序和Animated Tiles程序有所帮助&#xff0c;如下图所示&a…

Java反射面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

科技交流英语(2022秋)Unit 6 test

科技交流英语&#xff08;2022秋&#xff09;Unit 6 test 简介 由电子科技大学组织开设&#xff0c;授课教师为李京南、庞慧、刘兆林等5位老师。 课程介绍 英语广泛用于工程技术领域的国际交流。如何使用简洁的语言清楚地传递信息是工程师在国际舞台上常常面临的问题。本课…

【Vue】Vue重写教室管理系统的前端网页V1(前后端分离)--20221222

项目说明 目的 练习并熟悉Vue2 的API&#xff0c;来为Vue项目做准备&#xff1a; 插值语法插槽props和data父子组件通信Ajax异步请求数据生命周期函数methods方法computed属性vue-router、路由守卫、query/params传参、编程函数式路由模拟后端服务器传送数据打包项目 需要加…

Tableau可视化设计案例-06Tableau填充地图,多维地图,混合地图

文章目录Tableau可视化设计案例06 填充地图&#xff0c;多维地图&#xff0c;混合地图1.填充地图1.1 各省售电量填充地图 地图格式设置2.多维地图2.1 各省售电量多维地图3.混合地图3.1 各省售电量混合地图Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔…

如何花最少的资源遍历二叉树

文章目录一、递归遍历二叉树1.1 前序遍历1.2 中序遍历1.3 后序遍历二、非递归遍历二叉树2.1 前序遍历2.2 中序遍历2.3 后序遍历三、高效的 Morris 遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历关于二叉树的遍历也是面试过程中非常有可能考的话题。常见的简单的递归遍历二叉树&…

头条号权重高有什么优势?头条权重在线查询

头条号权重是根据你的关键词排名、预估流量等综合评估计算出的一个"权重值"&#xff0c;关键词指数越大&#xff0c;排名越好&#xff0c;预估的流量就越多&#xff0c;权重也就越高。 如果是查询头条号权重较少&#xff0c;可以看看这3个方法&#xff1a; 1、指…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的&#xff0c;基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌&#xff0c;在2011 年开发的计算机编程语言&#xff0c;它可以被用于Web、服务器、移动应…

腾讯云轻量应用服务器安装和配置宝塔 Linux 面板腾讯云专享版

宝塔 Linux 面板腾讯云专享版由腾讯云与堡塔公司联合开发&#xff0c;专享版在已支持普通版所有功能的基础上&#xff0c;还默认集成腾讯云对象存储、文件存储、内容分发网络和 DNS 解析插件。插件具备如下功能&#xff1a; 支持将对象存储的存储桶挂载到轻量应用服务器实例&a…

IDEA技巧:如何根据注释生成swagger注解

相信大家在进行java项目开发&#xff0c;肯定会接触到swagger的&#xff0c;一款动态生成api文档的神奇&#xff0c;只需要在api上面加上注解&#xff0c;就可以生成文档&#xff0c;现在我简单介绍下swagger的快速入门&#xff0c;最后再说下如何根据注释快速生成这些烦人的注…

(模板)矩阵乘法:斐波那契数列问题

在数学上&#xff0c;斐波那契数列以如下被以递推的方法定义&#xff1a; F(1)1&#xff0c;F(2)1, F(n)F(n-1)F(n-2&#xff09;&#xff08;n>3&#xff0c;n∈N*&#xff09;。 由以上推理公式&#xff0c;可以求得任何一项的斐波那契数列值。 弊端&#xff1a;斐波那…

UI自动化测试-pytest框架

在进行UI自动化测试的时候&#xff0c;我们需要工具来对测试用例进行收集&#xff0c;执行&#xff0c;标记&#xff0c;参数化。pytest就是这样一个工具。 pytest实际是python的一个单元测试框架&#xff0c;其他还有如unittest等&#xff0c;它可以实现按照规则搜索测试用例…

国产化服务环境中使用gunicorn部署Flask应用并配置开机自启

背景 服务端由第三方部署了一个基于 darknet &#xff08;一个较为轻型的完全基于C与CUDA的开源深度学习框架&#xff09;的识别算法服务&#xff0c;通过 Flask 的 Web 服务对业务服务暴露 API 接口。作为测试&#xff0c;一开始是直接通过 python3 app.py 的命令行启动的服务…

Ubuntu安装Anaconda详细步骤

本文主要讲述了在Ubuntu中安装anaconda的具体步骤。 准备环境&#xff1a;Ubuntu&#xff0c;Anaconda3 一、安装Anaconda3 在清华镜像下载Linux版本的anaconda&#xff1a; https://mirrors.bfsu.edu.cn/anaconda/archive/我选择的是Anaconda3-2022.10-Linux-x86_64.sh 下…

数组(7)

目录 1、一维数组 1、数组的创建 2、数组的初始化 3、一维数组的使用 4、一维数组在内存中的存储 2、二维数组 1、二维数组的创建 2、二维数组的初始化 3、二维数组的使用 4、二维数组在内存中的存储 3、数组越界 4、数组作为函数参数 1、冒泡排序&#xff1a; 5…

【学习笔记12.24】关于事务你必须知道的几件事

文章目录事务基础知识什么是事务&#xff1f;开启事务事务隔离级别事务基础知识 在MySQL中&#xff0c;只有InnoDB存储引擎是支持事务的。 什么是事务&#xff1f; 事务是逻辑操作的最小单元&#xff0c;使数据从一个状态转变为另一个状态。 也可以通过事务四大特性ACID来更…

SAP ERP 里的 Costing Sheet 成本核算表

有朋友在我的知识星球里向我提问&#xff1a; 请您帮忙讲一下这个AP0100的costing sheet rows这里都表示什么意思吗&#xff1f;比如row10、base Z010、overhead啥、描述、from、to row、credit都说明了什么&#xff0c;能够实现上面&#x1f446;&#x1f3fb;的目标吗&#x…

fpga实操训练(vga测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我自己读书那会&#xff0c;买的电脑还是以台式机居多&#xff0c;平板显示器也是才刚刚流行、且价格较高&#xff0c;视频接口也是以VGA为主。不像…

Linux搭建TFTP服务

TFTP是简单文件传输协议,是一个基于UDP协议实现的用在客户及和服务器之间进行简单文件传输的协议,适用于开销不大,不复杂的应用场景。TFTP协议专门为小文件传输而设计,只能从服务器获取文件,或者客户端往服务器写入文件,但是不能进行认证也不能列出目录。 1、安装tftp服…