HOT24-回文链表

news2024/9/21 5:27:07

    leetcode原题链接:回文链表 

题目描述

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

示例 1:

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

示例 2:

 

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

提示:

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

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题方法:两种解题方法介绍如下

解法1: 如果对空间没有要求,则先遍历链表输出到数组,然后再利用双指针的方法求解, o(n)的空间复杂度。

解法2: 如果要求o(1)的空间,则用翻转链表后半部分的方法:(1)先利用快慢指针找到前半部分链表的非空尾节点,这里要注意奇数和偶数个数链表的情况,初始位置都在同一个头节点;(2)反转后半部分链表;(3)同时遍历前半部分和后半部分链表,遇到对应节点不相同的情况之间返回false。[本文代码所用的方法]

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) {}
 * };
 */
 /*情况1,奇数个节点: 1->2->3->4->5 mid_node=3*/
 /*情况2,偶数个节点: 1->2->3->4->5->6 mid_node=3*/

class Solution {
public:
    bool isPalindrome(ListNode* head) {
       // 1.获取前半部分的尾节点
       ListNode* mid_node = get_mid_node(head);//前半部分链表的尾节点(所以最多可能比后半部分多一个节点)
       if (!mid_node) {//空节点也算回文节点
           return true;
       }
       ListNode* head1 = mid_node->next;
       // 2.逆转后半部分链表节点
       head1 = reverse(head1);
       // 3.判断是否为回文
       ListNode* p = head;
       ListNode* p1 = head1;
       while (p && p1) {
           if (p->val != p1->val) {
               return false;
           }
           p = p->next;
           p1 = p1->next;
       }
       return true;
    }

    ListNode* get_mid_node(ListNode* head) { //获取前半部分的最后一个尾节点(非空尾节点)
        if (head == nullptr) {
            return nullptr;
        }
        ListNode* p1 = head; //一次走1步
        ListNode* p2 = head; //一次走2步
        //注意这里循环执行的条件,需要保障前驱节点后面至少有两个待visit的节点
        while (p2->next && p2->next->next) { 
            p1 = p1->next;
            p2 = p2->next->next;
        }
        return p1;
    }
    ListNode* reverse(ListNode* head) {//反转单链表
        if (!head) {
            return head;
        }
        ListNode* pre = nullptr;
        ListNode* p = head;
        while (p) {
            ListNode* p_next = p->next;
            p->next = pre;
            pre = p;
            p = p_next;
        }
        return pre;
    }
};

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

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

相关文章

Leetcode 刷题 动态规划

198. 打家劫舍 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i] 2. 确定递推公式 dp[i] max(dp[i - 2] nums[i], dp[i - 1]); 3. dp数组如何初始…

分类预测 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的数据多输入分类预测

分类预测 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的数据多输入分类预测 目录 分类预测 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的数据多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-BiLSTM遗传算法优化双向长短…

【数据库】MySQL慢查询常用分析方法

系统慢慢越来越卡了&#xff0c;怎么定位系统慢的原因&#xff0c;大部分是因为服务器资源占用耗费高引起的&#xff0c;如CPU&#xff0c;内存和带宽等等。MySQL在日常开发工作中可能会遇到某个新功能在测试时需要很久才返回结果&#xff0c;这时就应该分析是不是慢查询导致的…

【javascript】2048小游戏

目录 什么是2048 游戏状态机 游戏界面绘制 3.1 界面 3.2 数字的背景颜色 分数逻辑 4.1 加分 4.2 更新最高分 方向控制逻辑 5.1 数组 5.2 随机数 5.3 初始化 5.4 判断数组是否全部填满 5.5 判断方格是否还能移动 5.6 上下左右的监听事件 5.7 移动 完整代码 …

微服务划分的姿势

我们知道微服务是一种理念&#xff0c;没有确切的定义和边界&#xff0c;好比设计原则&#xff0c;是属于抽象的概念。在定义不明确的情况下谈划分也是一种各说各话&#xff0c;具体问题需要具体分析&#xff0c;所以这篇文章谈到的划分也不是绝对标准&#xff0c;仅供参考。 有…

final, finally和finalize的区别

final、finally和finalize是Java中用于异常处理的关键字。每个关键字都有不同的功能。final是一个访问修饰符&#xff0c;finally是异常处理中的代码块&#xff0c;而finalize是Object类的方法。 除此之外&#xff0c;final、finally和finalize之间还存在许多区别。下面是final…

netty学习(1):1个客户端与服务器通信

1. 新建maven工程&#xff0c;添加netty依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

Avoid adding reactive properties to a Vue instance or its root $da

避免在运行时向Vue实例或其根$data添加反应性属性-在数据选项中预先声明它。 在页面中声明对象&#xff0c;直接修改即可。 data(){return{addressInfo:{}}}

阿里云服务器地域可用区怎么选?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

如何在Mac上安装 Stable Diffusion 来创作

​ 看着别人玩&#xff0c;是不是特想自己搭建一个&#xff0c;那么现在教程来了。 玩这种需要算力的东西&#xff0c;电脑配置肯定是越高越好了。我的电脑配置如下&#xff1a;​ 接下来就开始安装了。 第一步&#xff1a;安装homebrew 打开terminal终端&#xff08;comma…

使用maven中的profile动态打包不同环境的配置文件

maven中的profile可以在打包时动态选择不同的配置文件进行打入&#xff0c;在项目具有开发、测试、生产环境时可以更方便优雅的进行不同环境的打包运行 示例图&#xff1a; 1-配置profile 第一步需要为每个环境配置一个profile标签&#xff0c;在pom文件中进行配置。我这里只…

如何做好工程英语翻译

近年来&#xff0c;随着全球经济的持续发展&#xff0c;涉外工程业务日益增多&#xff0c;工程英语翻译的需求也越来越大。那么&#xff0c;工程英语翻译难吗&#xff0c;如何做好工程英语翻译&#xff0c;服务好的北京翻译公司哪里有&#xff1f; 据了解&#xff0c;工程英语语…

macOS Ventura 13.4.1With OpenCore 0.9.3 and winPE双引导黑苹果镜像

镜像特点 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直接替换opencore分区文件为clover引导文件&#xff09;备注…

知识蒸馏学习记录(二)

上一篇博文中我们介绍了知识蒸馏的一些基础知识&#xff0c;这里我们来学习其到底是如何完成知识蒸馏过程的。 知识蒸馏为何可以让学生网络模型小却性能强&#xff1f; 详细很多同学与我有相同的疑问&#xff0c;尽管它依靠不同的蒸馏温度T可以学得一些hard target标注无法包…

《计算机系统与网络安全》 第四章 密码学基础

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

8--Gradle进阶 - Gradle任务的入门、任务行为

8--Gradle进阶 - Gradle任务的入门、任务行为 Gradle Task Gradle 项目工程的管理 实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程&#xff0c;比如编译Java 源代码&#xff0c;拷贝文件&#xff0c; 打包Jar 文件&#xff0c;甚至可以是执行一个系统命…

flutter Exception: Gradle task assembleDebug failed with exit code 1

Exception: Gradle task assembleDebug failed with exit code 1 解决方案&#xff1a; 出现这个问题&#xff0c;可能是依赖的插件无法下载 找到项目的android->build.gradle, 将 google() mavenCentral()改成 maven{url https://maven.aliyun.com/repository/google }m…

XML的运用(XML解析)

一、XML文件的三种配置位置机读取方式 Java中配置XML文件的三种配置位置机读取方式&#xff1a;常用的三种 1、同包下 在演式之前我们把前期演示的部分给准备好&#xff1a; 我们以properties为后缀的文本为例&#xff1a; unamemybatis_ssm upassxiaoli urljdbc:mysql://lo…

短视频矩阵-短视频seo源码开发搭建

开发场景&#xff1a;抖音seo&#xff0c;短视频seo&#xff0c;抖音矩阵&#xff0c;短视频矩阵源码开源 一、 短视频矩阵源码需要掌握以下技术&#xff1a; 1. 视频编码技术 短视频矩阵系统利用视频编码技术&#xff0c;将视频文件进行压缩和解压缩&#xff0c;实现了高质…

cut一些常用的用法

目录 介绍语法示例切割提取指定列数据切割提取指定字符数据切割提取指定字节数据切割提取指定单词数据切割提取bash进程的PID号 小结 介绍 cut 译为“剪切, 切割” , 是一个强大文本处理工具&#xff0c;它可以将文本按列进行划分的文本处理。cut命令逐行读入文本&#xff0c;…