(链表专题) 234. 回文链表——【Leetcode每日一题】

news2024/11/15 18:37:11

234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

在这里插入图片描述

输入:head = [1,2,2,1]
输出:true

示例 2:

在这里插入图片描述

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围 [ 1 , 1 0 5 ] [1, 10^5] [1,105]
  • 0 <= Node.val <= 9

思路:

题目要求:以 O(1) 的空间复杂度来求解。

法一:

  • 切成两半,把后半段反转,然后比较两半是否相等

法二:快慢指针

  • 快慢指针遍历,边遍历,边反转前半部分
  • 然后比较两半是否相等

代码:(Java、C++)

法一:

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        int len = 0;
        ListNode tem = head;
        ListNode mid = head;
        while(tem != null){
            len++;
            tem = tem.next;
            if(len % 2 == 0){//找到后半部分头节点
                mid = mid.next;
            }
        }
        if(len % 2 != 0){
            mid = mid.next;
        }
        //将后半部分反转
        ListNode pre = mid;
        mid = null;
        while(pre != null){
            tem = pre.next;
            pre.next = mid;
            mid = pre;
            pre = tem;
        }
        for(int i = 0; i < len / 2 && mid != head; i++){//比较
            if(head.val == mid.val){
                head = head.next;
                mid = mid.next;
            }else{
                return false;
            }
        } 
        return true;

    }
}

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        int len = 0;
        ListNode* tem = head;
        ListNode* mid = head;
        while(tem != NULL){
            len++;
            tem = tem->next;
            if(len % 2 == 0){//找到后半部分头节点
                mid = mid->next;
            }
        }
        if(len % 2 != 0){//如果是奇数个,跳过中间节点
            mid = mid->next;
        }
        //将后半部分反转
        ListNode* pre = mid;
        mid = NULL;
        while(pre != NULL){
            tem = pre->next;
            pre->next = mid;
            mid = pre;
            pre = tem;
        }
        for(int i = 0; i < len / 2 && mid != head; i++){//比较
            if(head->val == mid->val){
                head = head->next;
                mid = mid->next;
            }else{
                return false;
            }
        } 
        return true;
    }
};

法二:快慢指针
Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if (head == null || head.next == null) return true;
        ListNode slow = head, pre = head;
        ListNode fast = head;
        head = null;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            //反转前半部分
            pre.next = head;
            head = pre;
            pre = slow;
        }
        slow = fast != null ? slow.next : slow;//如果是奇数个就跳过中间那个
        while(head != null){
            if(head.val == slow.val){
                head = head.next;
                slow = slow.next; 
            }else{
                return false;
            }
        }
        return true;

    }
}

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if (head == NULL || head->next == NULL) return true;
        ListNode* slow = head;
        ListNode* pre = head;
        ListNode* fast = head;
        head = NULL;
        while(fast != NULL && fast->next != NULL){
            slow = slow->next;
            fast = fast->next->next;
            //反转前半部分
            pre->next = head;
            head = pre;
            pre = slow;
        }
        slow = fast != NULL ? slow->next : slow;//如果是奇数个就跳过中间那个
        while(head != NULL){
            if(head->val == slow->val){
                head = head->next;
                slow = slow->next; 
            }else{
                return false;
            }
        }
        return true;
    }
};

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

【蓝桥杯】数组中存在K倍区间的子数组个数

文章目录 前言题目分析算法难度实战1、创建算法2、创建测试用例3、运行测试用例4、测试结果 总结 前言 蓝桥杯全国软件和信息技术专业人才大赛由工业和信息化部人才交流中心主办,每年参赛人数超过30000人。蓝桥杯大赛作为国内领先的全国性 IT 学习赛事&#xff0c;持续有力支撑…

Python爬虫自动化从入门到精通第9天(爬虫数据的存储)

爬虫数据的存储 数据存储概述MongDB数据库的概念MongDB的安装使用PyMongo库存储到数据库 数据存储概述 通常&#xff0c;从网页爬取到的数据需要进行分析、处理或格式化&#xff0c;然后进行持久化存储&#xff0c;以备后续使用。数据存储主要有以下两种方式&#xff1a; 1&am…

启动kafka报错ERROR Fatal error during KafkaServer startup. Prepare to shutdown

一、错误 报的错&#xff1a; ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.common.InconsistentBrokerIdException: Configured broker.id 0 doesn’t match stored broker.id Some(1) in meta.properties. If you m…

跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布

禅道插件上新了&#xff0c;OpenAI 禅道集成&#xff0c;可提供神奇海螺聊天、需求润色功能。 神奇海螺 “章鱼哥&#xff0c;你为什么不问问神奇海螺呢&#xff1f;”——海绵宝宝 那么&#xff0c;就让我们问一问神奇 海螺吧&#xff01;禅道上线神奇海螺功能&#xff0c;…

【C++】优先级队列,反向迭代器

文章目录 priority_queue的介绍和使用priority_queue的使用 反向迭代器 priority_queue的介绍和使用 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&a…

数据分析之Pandas 基础入门

一、初始Pandas pandas 是数据分析三大件之一&#xff0c;是Python的核心分析库&#xff0c;它提供了快捷、灵活、明确的数据结构&#xff0c;它能够简单、直观、快速的处理各种类型的数据结构。 pandas 支持的数据结构如下&#xff1a; SQL 或Excel 类似的数据有序或无序的…

后端程序员必须学会的编辑器vim

vim编辑器使用小结 1. vim简介 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个&#xff0c;事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Lin…

MyBatis(十一)、MyBatis查询语句专题

准备工作&#xff1a; 模块名&#xff1a;mybatis-007-select 打包方式&#xff1a;jar 引入依赖&#xff1a;mysql驱动依赖、mybatis依赖、logback依赖、junit依赖。 引入配置文件&#xff1a;jdbc.properties、mybatis-config.xml、logback.xml 创建pojo类&#xff1a;Car 创…

SQL sever数据库----基础增删改查操作与where条件限制

where条件限制方法 在SQL sever中使用where语句&#xff0c;可以对各种操作添加限制条件 基础格式为 ———————— where 逻辑表达式 例如限制条件的查询 select 范围 from 表名 where 逻辑表达式 逻辑表达式就是一个判断 如 a > 5 、a6>9、a>5 and b>5 各种…

k8s部署流水账

久仰大名k8s&#xff0c;业余选手一直望而却步。最近终于初步炮制成功。知道了大概的流程。本篇为部署备忘录。 经过的大环节有&#xff1a;修改树莓派/boot/cmdline.txt甚至/cmd/config.txt里面的集群相关设置&#xff0c;把cgroup驱动enable好。swap关掉。这些都是所有集群内…

比较几种热门Hybrid App前端框架

作为一种既能够在原生应用程序环境中运行&#xff0c;也能够在 Web 浏览器中运行的应用程序&#xff0c;Hybrid App 主要使用 Web 技术进行开发&#xff0c;如 HTML、CSS 和JavaScript&#xff0c;并使用一个中间层将其封装在原生应用程序中。随着技术的持续推进&#xff0c;Hy…

3.3栈和队列的应用

3.3.1括号匹配问题 IDE可视化的编程环境 作为一名程序开发人员&#xff0c;不管你使用哪门语言开发都有很多可以选择的集成开发环境IDE&#xff08;Integrated Development Environment&#xff09;&#xff0c;IDE是提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器…

程序员挣够了钱,到中年失业真的很可怕吗?

借用最近很火的一张图&#xff0c;看看没有工作&#xff0c;你手里的存款够用几年&#xff08;按每年年化3.5%&#xff0c;利息继续放入理财计算&#xff09;&#xff1a; 如果每年花销在10万左右&#xff08;折合每个月8333元&#xff0c;应该是比较富足的&#xff09;&#x…

字节跳动高频 “ 120道 ” 软件测试面试题解析

1、web测试和APP测试的区别&#xff1f; web测试和APP测试都离不开测试的基础知识和测试原理。 不同点是&#xff1a;web 测试更多的是考虑自身功能和浏览器兼容&#xff0c;app 测试要考虑手机本身固有的属性&#xff0c;所以 app 测试还需要注意以下几点&#xff1a; 中断…

FreeRTOS 事件组

实现功能&#xff0c;当任务A,B完成后执行串口任务。 不同任务用不同的位表示 configUSE_16_BIT_TICKS1,bitx(0~7)&#xff1b; configUSE_16_BIT_TICKS设置为0 &#xff0c;bitx(0~23)&#xff1b; //串口任务的头文件 #ifndef __TRANSMIT_H #define __TRANSMIT_H#include…

nVisual创建机柜流程

一、制作机柜 1.先在绘图软件中把机柜画出来 2.把机柜导出一张SVG格式的图片 二、创建机柜 1.打开nVisual右上角点击管理选择模型库 2.选择设备点击新增&#xff0c; 依次录入机柜品牌、型号、宽高深等基础数据&#xff0c; 再上传相应的前视图&#xff08;在系统里展示…

自学python有推荐的么

大学生自学那必然是首推B站大学哇能称之为大学不是没有道理的&#xff0c;看看各个领域的学习分享都是非常多的&#xff0c;关键是看着弹幕就感觉像是在和一帮志同道合的小伙伴一起学习&#xff0c;自学的道路也不再孤单了&#xff0c;遇见不会的没准还能在弹幕和评论区找到答案…

TensorFlow详解3举个cnn卷积栗子

一、实现简单的cnn卷积神经网络 实现简单的cnn卷积神经网络&#xff08;用到的是MNIST手写数字的数据库yann.lecun.com/exdb/mnist&#xff09; 用到激活函数&#xff1a; 二、步骤 输入端是28281这样的一张图片&#xff0c;就是一张黑白的图片&#xff08;假如他是一张彩色…

Cat入门学习笔记整理

Cat入门学习笔记整理链路调用追踪介绍链路调用监控实现过程简析常见的链路追踪框架CAT报表介绍Transaction报表Event报表Problem报表Heartbeat报表Business报表Cat实战docker安装客户端集成API介绍Transaction扩展APIEventMetricCAT监控界面介绍DashBoardTransactionEventProbl…

C++ 构造函数与析构函数

1.构造函数的引出 一个实实在在的对象&#xff0c;应该有合法的属性&#xff0c;而不是在对象出来之后&#xff0c;再去设置属性&#xff0c;要实现这个过程&#xff0c;必须在对象出来的这一时刻初始化合法的值&#xff0c;而且不能由程序员调用&#xff0c;要给属性合法的值&…