详解链表oJ<反转链表,链表的中间节点及链表的回文>

news2024/11/18 11:39:28

在这里插入图片描述

hello,大家好,这里是Dark FlameMaster,今天和大家分享的是有关数据结构链表的几道题目,链表的中间节点,反转链表及判断链表是否为回文结构,放在一起讲解会印象更加深刻。

文章目录

    • 一,链表的中间节点
    • 二,反转链表
    • 三,链表的回文

一,链表的中间节点

  1. 链接:链表的中间节点

在这里插入图片描述

在这里插入图片描述

分析:
 如果想要得到链表的中间节点,最简单的思路就是从头结点遍历整个链表,就可以知道链表的长度,假设为num个,要求是如果为偶数个数,返回第二个节点。得到个数后要创建新的节点,往后走num/2个位置。如果num为奇数,如5,往后next两步,如果是偶数如6,往后next3步,皆满足要求。
实现:

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* ret = head;
    int len = 0;
    int k = 0;
    while(ret)
    {
        ret = ret -> next;
        len++;
    }
    ret = head;
    while(k < len / 2)
    {
        k++;
        ret = ret -> next;
    }
    return ret;
}

此题还有一种双指针的方法
思路:
 设置快慢指针,快指针一次走两步,慢指针一次走一步,还是分偶数和奇数的情况。
如果是奇数的话
在这里插入图片描述
如果是偶数的话
在这里插入图片描述
要注意观察fast的最终位置
实现如下

struct ListNode* middleNode(struct ListNode* head) {
	struct ListNode* val = NULL;
	struct ListNode* baga = NULL;
	val = head;
	baga = head;
	while (val->next != NULL && val->next->next != NULL)
	{
		val = val->next->next;
		baga = baga->next;
	}
	if (val->next == NULL)
	{
		return baga;
	}
	else
	{
		return baga->next;
	}
}

二,反转链表

链接:反转链表

这道题的介绍很简单,给定一个链表head,将链表反转过来。就像这样。
在这里插入图片描述

在这里插入图片描述
需要注意的是,这个链表的长度有可能为零。
思路:
 解决这道题,不可冒昧更改一个节点的指向,要记录后续节点,同时还要保留前一个节点,好让这个节点可以指向前一节点,所以要设置三个结构体指针变量,分别表示要修改的节点,要修改节点的前一节点,该节点的后边的节点。
实现

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULL;//设置n1为空
    n2=head;//n2为head,首先指向空
    if(n2)
    {
        n3=n2->next;//判断n2是否为空,若为空则没有next      
    }
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)//判断n3是否为空
        {
            n3=n3->next;
        }
    }
    return n1;
}

下边的动图可以帮助大家理解
在这里插入图片描述
对比代码看完这些动图就可以很清晰的理解。

三,链表的回文

链接:链表的回文
在这里插入图片描述
设计时间复杂度为O(N),空间复杂度为O(1)的算法

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

 空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
 上边已经说了链表的长度有限制,空间复杂度为O(1)无疑,只要写出的代码中不使用两层以上循环遍历,用有限的多个循环,时间复杂度都为O(1)
判断是否为回文结构
如用例中的1-2-2-1,从中间分割后两边对称。
再如
1-2-3-2-1,仍然为回文结构。

如何判断是否为回文结构呢?好像很难,因为不是双向链表,我们比较的时候找不到尾的前一个,如果硬要一个一个判断的话,时间复杂度一定不符合要求。

如果使用上边的两个题目的思路
 上边的找中间节点,刚好为后一个中间节点,找到中间节点后,记录中间节点后,将中间结点之后的链表反转,反转后就可以进行比较了。这也是这三道题放在一起的原因。直接cv,将函数复制过来,判断函数内容十分简单,大家可以对照观察。
思路已经十分清楚了
实现如下:

class PalindromeList {
public:
struct ListNode* middleNode(struct ListNode* head) {
	struct ListNode* val = NULL;
	struct ListNode* baga = NULL;
	val = head;
	baga = head;
	while (val->next != NULL && val->next->next != NULL)
	{
		val = val->next->next;
		baga = baga->next;
	}
	if (val->next == NULL)
	{
		return baga;
	}
	else
	{
		return baga->next;
	}
}
struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULL;
    n2=head;
    
    if(n2)
    {
        n3=n2->next;
        
    }
        while(n2)
         {
             n2->next=n1;
            n1=n2;
            n2=n3;
             if(n3)//判断n3是否为空
              n3=n3->next;
         }
    return n1;
}

    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode*mid=middleNode(A);
        struct ListNode* rmid =reverseList(mid);
        while(rmid&&A)
        {
            if(rmid->val!=A->val)
            {
                return false;
            }
            rmid=rmid->next;
        A=A->next;
        }
        return true;

    }
};

鄙人才疏学浅,如果有更好的方法欢迎评论区留言。
 这三道题讲到这里就结束啦,如果有帮助的话希望大家三连支持哇

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

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

相关文章

C#,数值计算——数据建模FGauss的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class FGauss : MultiFuncd { public void funk(double x, double[] a, ref double y, double[] dyda) { int na a.Length; y 0.0; for (int …

吃鸡达人专享!提高战斗力,分享干货,查询装备皮肤,保护账号安全!

大家好&#xff01;作为专业吃鸡行家&#xff0c;我将为您带来一些热门话题和实用内容&#xff0c;帮助您提升游戏战斗力&#xff0c;分享顶级游戏作战干货&#xff0c;并提供便捷的作图工具和查询服务。让我们一起享受吃鸡的乐趣&#xff01; 首先&#xff0c;我要推荐一款绝地…

CleanMyMacX 永久版下载激活码破解版

CleanMyMac X最新破解版V4.9.2是一款出色的Mac 系统垃圾清理程序。 该软件具有强大的垃圾清理功能&#xff0c;可以释放数 GB 的空间&#xff0c;让您的 Mac 焕然一新。 带有激活码的完整破解版 CleanmyMac 可加速您的 Mac 设备。 此外&#xff0c;cleanmymac还能帮助您从 Mac…

2023最新ICP备案查询系统源码 附教程 Thinkphp框架

2023最新ICP备案查询系统源码 附教程 thinkphp框架 本系统支持网址备案&#xff0c;小程序备案&#xff0c;APP备案查询&#xff0c;快应用备案查询 优势&#xff1a; 响应速度快&#xff0c;没有延迟&#xff0c;没有缓存&#xff0c;数据与官方同步 源码下载&#xff1a;ht…

Puppeteer基础知识(一)

Puppeteer基础知识&#xff08;一&#xff09; Puppeteer基础知识&#xff08;一&#xff09;一、简介二、其他一些自动化测试工具三、Puppeteer常用命令四、常见问题解决&#xff1a; 一、简介 Puppeteer 是一个强大而灵活的工具&#xff0c;可以用于网页爬虫、自动化测试、性…

大数据Doris(六):编译 Doris遇到的问题

文章目录 编译 Doris遇到的问题 一、js_generator.cc:(.text+0xfc3c): undefined reference to `well_known_types_js’

华为云新开源低代码引擎 TinyEngine

在当今数字化飞速发展的时代&#xff0c;企业对高效、敏捷的应用程序需求日益旺盛。为了满足这一需求&#xff0c;越来越多的低代码开发平台开始涌现。这些平台通过提供简单易用的开发工具和优化后的开发流程&#xff0c;帮助开发者快速构建高质量、可重复使用的应用程序&#…

Suricata + Wireshark离线流量日志分析

Suricata 环境搭建&#xff1a;基于Ubuntu坏境下的Suricata坏境搭建_奈何&#xff20;_&#xff20;的博客-CSDN博客 suricata&#xff1a;监控日志 wireshark:监控流量 同时使用需要降噪&#xff0c;因为规则有许多重叠 题目及要求我打包上传了&#xff0c;有需要的同学自…

十一工具箱流量主小程序源码

无授权&#xff0c;去过滤机制版本 看到网上发布的都是要授权的 朋友叫我把他去授权&#xff0c;能用就行 就把过滤去了 这样就不用授权 可以免费使用 白嫖党专属 一切接口可用&#xff0c;无需担心不能用 授权者不关站一直可以用 源码下载&#xff1a;https://download.csdn.…

彻底理解浏览器cookie策略

cookie介绍 为什么存在cookie&#xff1f; &#xff08;1&#xff09;cookie存在的原因 因为http请求是无状态的&#xff0c;同一个用户从浏览器向A服务器发送两次请求&#xff0c;A服务器无法判断这两次请求是否是同一个用户。所以&#xff0c;浏览器提供了客户端携带cooki…

threejs 透明贴图,模型透明,白边

问题 使用Threejs加载模型时&#xff0c;模型出现了上面的问题。模型边缘部分白边&#xff0c;或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时&#xff08;一个透贴和其他贴图&#xff0…

互联网Java工程师面试题·Redis篇·第一弹

目录 1、什么是 Redis? 2、Redis 优势 3、Redis 与其他 key-value 存储有什么不同&#xff1f; 4、Redis 的数据类型&#xff1f; 5、使用 Redis 有哪些好处&#xff1f; 6、Redis 相比 Memcached 有哪些优势&#xff1f; 7、Memcache 与 Redis 的区别都有哪些&#xf…

MyBatisPlus(十四)主键策略

说明 MyBatis Plus 集成了多种主键策略&#xff0c;帮助用户快速生成主键。 雪花算法ID&#xff08;默认策略&#xff09;&#xff08;推荐&#xff09;UUID自增ID用户输入ID&#xff08;必须用户每次插入数据时&#xff0c;手动传入ID&#xff09; 雪花算法ID&#xff1a;I…

ModelScope-agent体验

7月在魔搭社区hackathon的时候就了解到了魔搭在做的这件事&#xff0c;前段时间开源了&#xff0c;去体验一 本文写的很浅&#xff0c;没有做深入尝试 一.在线体验 体验地址&#xff1a;https://modelscope.cn/studios/damo/ModelScopeGPT/summary 效果还是挺惊艳的 二.部署…

认识File 类和InputStream, OutputStream

Java中通过file类来对一个文件&#xff08;包括目录&#xff09;进行抽象的描述。并且有File类对象&#xff0c;并不代表真实存在该文件。认识File类&#xff0c;就先了解File类的属性&#xff0c;构造方法&#xff0c;方法。 属性&#xff1a; 修饰符及类型 属性 …

最全最详细最高质量 java 面试题

“ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址 面试题手册 面试题手册 学习建议 最全最详细最高质量 java 面试题&#xff0c;建议不要死记硬背&#xff0c;每天过一下&#xf…

el-tabs(标签栏)的入门学习

el-tabs(标签栏)的入门学习 适用场景 与导航栏相似&#xff0c;项目中常见的是点击某个导航栏&#xff0c;主页面&#xff08;el-main&#xff09;模块的最上方会显示我们的标签栏集合&#xff0c;点击不同的导航栏&#xff0c;标签栏会在不断追加&#xff0c;若点击到标签集合…

micro-ROS中对消息的内存管理

文章目录 1.背景2.答案2.1.基本类型及其数组&#xff0c;不需要2.1.序列类型&#xff08;复合类型、复合序列类型&#xff09;&#xff0c;需要 3.内存申请方法3.1.手动申请&#xff08;Manual allocation&#xff09;3.1.工具辅助&#xff08;micro-ROS utilities&#xff09;…

css入门知识点

CSS&#xff08;层叠样式表&#xff09;完整知识点 1. 什么是CSS&#xff1f; <a id"what-is-css"></a> CSS是一种用于描述网页上元素样式和布局的样式表语言。它使开发人员能够控制网页的外观和排版&#xff0c;从而提供更好的用户体验。 2. CSS基础…

基于毫米波雷达的可行驶区域检测(Freespace)

说明 随着具备测高能力、更高角度分辨率、更远检测范围的4D毫米波雷达的出现&#xff0c;很多之前只能用摄像头/激光雷达做的事毫米波雷达也开始涉足(并且可以做得很好)&#xff1a;比如目标识别、SLAM、以及本博文将要讨论的可行驶区域检测(Freespace)。以往(至少是我个人)对于…