首页 > 其他分享 >Letcode--反转链表+回文链表

Letcode--反转链表+回文链表

时间:2024-10-11 14:51:24浏览次数:10  
标签:pre slow cur -- fast next 链表 Letcode

  ok小伙伴们,今天给大家带来关于链表的算法题目。首先学习一下反转链表,大家先看题目:

  这道题目比较简单,所以先给大家看一下代码:

ListNode* reverseList(ListNode* head) {
        if(!head){
            return nullptr;
        }
        ListNode *pre=nullptr,*cur=head,*nextcur;
        while(cur){
            nextcur=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nextcur;
        }
        return pre;
    }

  在代码中,我们使用了pre、cur、nextcur指针。pre用于记录反转后应指向的节点(初始为nullptr),cur指向当前节点, nextcur为cur未反转所指向的下一个节点,用于链表的遍历。

  最后链表遍历完成后,cur为nullptr,pre为反转后的头节点,返回pre即可。

  在此基础上,我们引入新的题目:回文链表,大家先阅读题目:

  先给大家举个例子,如链表节点为1->2->3->2->1,从前向后和从后向前遍历结果相同,那么它就算回文链表。如果链表节点为1->2,从前向后遍历顺序为12,从后向前遍历顺序为21,结果不同,那么就不是回文链表。

 

   对于此例,我们采用快慢指针方法,慢指针一次走一步,快指针一次走两步。(看过我之前文章的小伙伴应该知道我们用快慢指针解决过链表是否有环的问题)fast指针从1出发,走到3,走到2,走到nullptr。(节点个数为偶数才会走到nullptr)当fast走到nullptr时,slow走到了3(第二个),如果我们此时将slow及其之后的链表反转,并将fast移动到原先的head,并且fast速度恢复为1,再对两条链表进行遍历(循环结束条件为slow为nullptr或者fast为nullptr),分别比较节点数据是否相同即可得出最终答案。

     对于奇数个节点,fast从1走到3,走到1。slow此时走到3。此时将slow再继续下移一步,移动到2,再将slow及其以后的链表反转,并将fast移动到原先的head,并且fast速度恢复为1,再对两条链表进行遍历(循环结束条件为slow为nullptr),再对两条链表进行遍历,分别比较节点数据是否相同即可得出最终答案。

    据此我们给出代码:

bool isPalindrome(ListNode* head) {
        if(!head->next){
            return 1;
        }
        ListNode *fast=head,*slow=head;
        int flag=1;
        while(fast->next){
            fast=fast->next->next;
            slow=slow->next;
            if(!fast){
                flag=0;
                break;
            }
        }
        if(flag){
            slow=slow->next;
        }
        fast=head;
        ListNode *pre=nullptr,*cur=slow,*nextcur;
        while(cur){
            nextcur=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nextcur;
        }
        slow=pre;
        while(slow){
            if(fast->val!=slow->val){
                return 0;
            }
            slow=slow->next;
            fast=fast->next;
        }
        return 1;
    }

    今天的文章就写到这里,希望大家多多支持,有疑问的地方欢迎在评论区讨论!谢谢大家! 

 

标签:pre,slow,cur,--,fast,next,链表,Letcode
From: https://blog.csdn.net/weixin_74901355/article/details/142852600

相关文章

  • Win11系统提示找不到storagewmi.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个storagewmi.dll文件(挑选合适的版本文件)把......
  • 针对SEO方向的页面强制跳转问题
    这篇文章主要是帮助不知道网站代码且想要了解强制跳转问题的小伙伴,快速了解网站优化相关的页面强制跳转问题~什么是网站强制跳转?网站强制跳转,简单来说就是当用户访问某个网页时,页面会自动跳转到另一个页面。这种跳转通常是通过JavaScript代码来实现的。运作原理:JavaScript......
  • 【Shell】基础的 shell 脚本编程入门
    目录注意点数值计算(())letexprbc基础条件测试test中括号双中括号各种比较逻辑注意点通配符和正则表达式不同符号含义不同,特别是*这个符号通配符:零到无限多个字符的意思正则表达式:重复零到无限多个前一个字符的意思${name}#取出变量结果$(date)#在括......
  • upload-labs 文件上传靶场 详细攻略(pass1-10)
    前言:本篇文章主要讲解upload-labs第1-10关,原因是前十关的代码过滤思路大体上是相似的,无非是每关缺少了某几个函数导致过滤不严谨造成漏洞,因此可以归为一起学习,从而熟悉文件上传中常用的过滤函数,了解代码的原理和设计的目的文件上传漏洞对于文件上传漏洞的简要概括就......
  • SWAP农业模型数据制备、敏感性分析及气候变化影响
    SWAP模型的各个组成部分,包括气象、土壤、作物和管理措施等数据的准备和输入。通过模型的实践操作和结果分析,让参与者能够不仅理解模型背后的科学原理,同时掌握如何在实际工作中应用模型来解决问题。此外,还将深入探讨如何通过修改模型代码来定制和优化模型,以适应特定的研究需求或......
  • 教你如何免费获取股票数据用python、JavaScript (Node.js)、JAVA等多种语言的实例代码
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • IPv 4
    IP协议网络层主要由IP(网际协议)和ICMP(控制报文协议)构成,对应OSI中的网络层,网络层以实现逻辑层面点对点通信为目的。目前应用最广泛的IP协议为IPv4基本概念给出主机:配有IP地址但不具有路由控制能力的设备(广义上有IP就可以称为主机)路由器:配有IP地址且具有路由控制能力,也叫......
  • ARM Cortex-M3/M4内核架构:中断处理过程
    目录一、概述1.保存现场?什么是现场?现场包括什么?2.怎么处理异常?我们先来简单介绍下。3.又怎么恢复现场?4.异常进入流程(核心流程)二、保存现场三、恢复现场1、EXC_RETURN2、恢复现场四、异常处理优化1、末尾连锁2、延时到达3、出栈抢占五、总结一、概述中断......
  • 基于R语言机器学习遥感数据处理与模型空间预测
    随机森林作为一种集成学习方法,在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性,随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中,使用Bootstrap抽样生成不同的训练集,并在节点分裂时随机选择特征子集,这使得模型具备......
  • Freertos应用与源码分析:临界区
    目录一、概述二、应用三、源码分析1、进入临界区2、退出临界区3、中断临界区(1)应用(2)进入中断临界区(3)退出中断临界区四、注意事项一、概述        当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整......