首页 > 其他分享 >力扣刷题--027.回文链表

力扣刷题--027.回文链表

时间:2024-11-19 12:15:00浏览次数:3  
标签:力扣 head ListNode -- next 链表 l2 节点

想放弃吗?,那当初为什么要开始?

题目描述

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

输入: head = [1,2,3,3,2,1]

输出: true

示例 2

输入: head = [1,2]

输出: false

思路分析

  • 如果使用容器来做,使用栈,先把元素都入栈,然后出栈和链表元素比较。

  • 时间复杂度O(n),空间复杂度O(n).不是最优解

  • 最优解:时间复杂度O(n),空间复杂度O(1),不使用额外变量,仅仅通过操作指针来完成

  1. 通过快慢指针找到中间节点

  2. 反转后半部分的链表

  3. 定义两个指针,依次判断,前半部分的链和后半部分的链是否相等

完整代码

class Solution {
public:
    //反转链表
    ListNode* Reverse(ListNode*head)
    {
        auto newhead=new ListNode(0,head);
        auto p=head;
        newhead->next=NULL;//要断开
        while(p!=NULL)
        {
            auto q=p->next;
            p->next=newhead->next;
            newhead->next=p;
            p=q;
        }
        return newhead->next;
    }

    //寻找中间节点
    ListNode* findMiddle(ListNode*head)
    {
        auto fast=head;
        auto slow=head;
        //快指针要么走到最后一个节点,要么走到空,对应着奇数偶数个节点
        while(fast!=NULL&&fast->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
        }
        return slow;
    }

    //判断两个链表是否一致
    bool Is_same(ListNode*l1,ListNode*l2)
    {
        while(l2&&l1)
        {
            if(l1->val!=l2->val)    
                return false;
            l1=l1->next;
            l2=l2->next;
        }
        return true;
    }


    bool isPalindrome(ListNode* head) {
        if(head==NULL)
            return true;
        //最优解:
        //1.找到中间节点
        //2.反转中间节点往后的节点
        //3.从第一个节点和中间节点往后遍历,看是否完全相等
        ListNode* middle=findMiddle(head);
        ListNode* l2=Reverse(middle);
        return Is_same(head,l2);


    }
};

标签:力扣,head,ListNode,--,next,链表,l2,节点
From: https://blog.csdn.net/m0_75266675/article/details/143880393

相关文章

  • docker原理、常用命令,以及部署nginx、tomcat、es+kibana练习(一)
    基本结构镜像(image):docker镜像可以当作一个模板,通过这个模板可以创建多个容器。例如一个tomcat镜像=>运行=>容器(提供服务)容器(container):docker利用容器技术,可以独立运行一个或一组应用(容器间相互隔离)docker容器通过镜像来创建,即容器中的进程依赖于镜像中的文......
  • Windows基础及bat蠕虫病毒编写
    常见端口及其服务21ftp23talnet80web80-89都可能443ssl有过心脏滴血漏洞445msb1433mssql1521oracle2082/3主机管理系统登录(国外用的多)2222da虚拟主机管理系统登录(国外较多)3128squid代理默认端口-漫游内网3306mysql3311/2kangle主机管理系统......
  • 打卡信奥刷题(264)用C++信奥P2010[普及组/提高] [NOIP2016 普及组] 回文日期
    [NOIP2016普及组]回文日期题目背景NOIP2016普及组T2题目描述在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用888位数字表示一......
  • 程序员到底有没有女朋友?
    程序员没有女盆友很正常啊,虽然程序员的工资比较高,但是他们这个群体每天的工作时间比较长,996、007、熬夜通宵都是很正常的,自己挣了钱都没有时间花。很多优秀的程序员他们都把编程当做爱好,也就是说上班编程下班还是在玩编程,编程的过程完全是一个人的战役,静静地坐在电......
  • 专业 UI 设计公司 - 兰亭妙微:让界面设计成为艺术与功能的完美融合
    在数字化浪潮汹涌澎湃的今天,UI设计的重要性愈发凸显,它宛如一座桥梁,连接着用户与数字产品之间的情感与交互。而兰亭妙微,作为一家专业的UI设计公司,正以其独特的视角和卓越的能力,将界面设计提升到艺术与功能完美融合的新境界。艺术之美:视觉盛宴的缔造者色彩的交响乐 在兰亭妙......
  • Apache Dolphinscheduler数据质量源码分析
    ApacheDolphinScheduler是一个分布式、易扩展的可视化数据工作流任务调度系统,广泛应用于数据调度和处理领域。在大规模数据工程项目中,数据质量的管理至关重要,而DolphinScheduler也提供了数据质量检查的计算能力。本文将对ApacheDolphinScheduler的数据质量模块进行源码分......
  • 国标GB28181视频平台EasyCVR大华设备视频平台EasyCVR平台如何接入摄像机
    在现代视频监控系统中,兼容性和灵活性是关键要素,尤其是在多品牌、多协议的环境中。EasyCVR作为一个强大的视频监控管理平台,以其广泛的兼容性和多样化的接入方式,为用户提供了一个集中管理不同品牌和协议摄像机的解决方案。以下是国标GB28181视频平台EasyCVR支持的几种常见摄像机接入......
  • Godot 字体边框shader
    shader_typecanvas_item;uniformfloatoutline_width=1.0;uniformvec4outline_color:source_color=vec4(1,0,0,1);voidfragment(){vec2uv=UV;vec2uv_up=uv+vec2(0,TEXTURE_PIXEL_SIZE.y)*outline_width;vec2uv_down=uv+vec2(0,-T......
  • HarmonyOS-Chat聊天室|纯血鸿蒙Next5 api12聊天app|ArkUI仿微信
    自研原生鸿蒙NEXT5.0API12ArkTS仿微信app聊天模板HarmonyOSChat。harmony-wechat原创重磅实战纯血鸿蒙OSArkUI+ArkTs仿微信App聊天实例。包括聊天、通讯录、我、朋友圈等模块,实现类似微信消息UI布局、编辑器光标处输入文字+emo表情图片/GIF动图、图片预览、红包、语音/位置UI......
  • 编译生产pdb文件的软件
    转自:https://www.jiandaoyun.com/blog/article/330326/编译生产PDB文件的软件有VisualStudio、GCC和Clang等。这些工具在编译过程中能够生成PDB(ProgramDatabase)文件,用于调试和诊断。VisualStudio是其中最常用的工具,其内置的调试器功能强大,能够帮助开发人员快速定位和修复代码中......