leetcode链表

在这里插入图片描述
这几天手的骨裂稍微好一点了,但是还是很疼,最近学校的课是真多,我都没时间做自己的事,但是好在今天下午是没有课的,我也终于可以做自己的事情了。

今天分享几道题目

移除链表元素

这道题我们将以两种方法开解决,但是我觉得从总体思路上来讲,都可以称为双指针,第一个就是我们在我们原链表上进行修改,我们和之前顺序表的一个题目很是相似,就是我们遇到val就删除,那因为是链表,我们可以理解为释放它这个当前的空间,然后进行当前位置的前一个和后以一个位置的链接就行。

在这里插入图片描述

我们给两个指针,然后cur的作用就是进行遍历,我们的prev这个指针就是找到它当前位置的前一个位置,因为我们要删除当前的位置,如果没有前面这个前驱指针,我们删除当前位置之后,前一个和后一个就链接不上了。

struct ListNode* removeElements(struct ListNode* head, int val) {
        struct ListNode* prev = NULL;
        struct ListNode* cur = head;
        while(cur)
        {
            if(cur->val == val)
            {
                if(prev == NULL)
                {
                    head = head->next;
                    cur = cur->next;
                }
                else
                {
                    struct ListNode* tmp = cur;
                    cur = cur->next;
                    free(tmp);
                    prev->next = cur;
                }
              
            }
            else
            {
                prev = cur;
                cur = cur->next;
            }
        }
        return head;
}

这个就是我们这道题的一个解决方法,还有就是利用单链表的尾插思想,我们重新搞一个链表,然后进行前后链接。

struct ListNode* removeElements(struct ListNode* head, int val) {
        struct ListNode* newhead = NULL, *tail = NULL;
        struct ListNode* cur = head;
        while(cur)
        {
            if(cur->val == val)
            {
                cur = cur->next;
            }
            else
            {
                if(newhead == NULL)
                {
                    newhead = cur;
                    tail = newhead;
                }
                else
                {
                    tail->next = cur;
                    tail = tail ->next;
                }
                cur =  cur->next;
            }
        }
        if(tail)
            tail->next = NULL;
        return newhead;
}

这个就是我们的另一种方法,其实就是一个尾插,大家仔细画图就能解决。
在这里插入图片描述
就是我们如果没遇到val,就拿下来,上面一个cur指针来遍历原来的链表,下面的指针来遍历新的链表,这里我觉得大家不理解的地方,可能是为什么我们的tail还要指向空,这里我来解释一下,如果我们的链表尾节点的值也是val,这个时候如果我们不进行处理的话,tail的next是尾节点,所以要判断一下。
反转链表

这个题目我们也有两种做法,第一种就是我们把箭头方向换一下就行了。
在这里插入图片描述
我们可以个三个指针。
在这里插入图片描述
可以看到我们给三个指针,第一指针n1的作用就是让n2指向它,这样我们的箭头方向就是已经换过,但是不仅仅是这样,假设我们换第一个n2指向空的时候,n2后面节点的位置就是不知道的,所以我们这里不能这样做,我们的先用一个next的指针来保存后面的位置,这里才能找到写一个地址的节点。

struct ListNode* reverseList(struct ListNode* head) {
        if(head == NULL)    
            return NULL;
        struct ListNode* n1 = NULL;
        struct ListNode* n2 = head;
        while(n2)
        {
            struct ListNode* n3 = n2->next;
            n2->next = n1;
            n1 = n2;
            n2 = n3;
            if(n3)
                n3 = n3->next;
        } 
        return n1;

}

这个就是我们这道题目的答案,我么这里其实需要注意两点,这两点leetcode会提示,第一就是如果一进来就是空的,就需要我们进行判断,第二个就是我们的n3会为空,什么时候为空,大家可以画图加上走读代码来看。
在这里插入图片描述
这里就是我们n3为空的时候,我们加上判断就可以解决了,我们这里还有一个方法就是和单链表是一样,那就是头插。
在这里插入图片描述
感觉下次得搞个录屏的才行,这个样子的动图总是整不上,会有点问题,大家也不好理解我的意思,如果有人看我的文章,觉得这个题目还是有问题,请私聊我
下面是代码

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* newhead = NULL;
    struct ListNode* cur = head;
    while(cur)
    {
        struct ListNode* next = cur->next;
        if(newhead == NULL)
        {
            cur->next = NULL;
            newhead = cur;
            cur = next;
        }
        else
        {
            cur->next = newhead;
            newhead = cur;
            cur = next;
        }
        
    }
    return newhead;
}

链表中间节点
这个题目的思路其实就是快慢指针,一个指针走的快一点,一个指针走的慢一点就可以解决

struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

这里我们需要注意的最重要的一点其实就是我们要注意奇数和偶数项,虽然都可以找到中间项,但是偶数项的时候fast会为空,所以while加个条件就可以了。
寻找第K个节点

这和我们快慢指针其实是一样的,最重要的就是注意有没有越界就OK了

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    struct ListNode*slow=pListHead;
     struct ListNode*fast=pListHead;
     
     while((k--))
     {
        if(fast==NULL)
            return NULL;
        fast=fast->next;
     }
     while(fast)
     {
        fast=fast->next;
        slow=slow->next;
     }
     return slow;
}

.合并两个有序链表

这个题目我觉得其实就是仔细一点就能解决,还是那句话,我们得多画图,因为这其实就是一个尾插,我们就把两个链表各给一个指针,比较大小,小的拿出来,然后进行尾插到新链表就可以了。
在这里插入图片描述
反正大家就先画图,自己先走一遍,然后再来过就可以很好的解决了,代码我给大家看看。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if(list1 == NULL && list2 == NULL)
    {
        return NULL;
    }
    struct ListNode* cur1 = list1;
    struct ListNode* cur2 = list2;
    struct ListNode* newhead = NULL;
    struct ListNode* tail =NULL;
    while(cur1 && cur2)
    {
        
        if(cur1->val < cur2->val)
        {
            if(newhead==NULL)
            {
                newhead = tail = cur1;
                
            }
            else
            {
                tail->next = cur1;
                tail = tail->next;

            }
            cur1 = cur1->next;
        }
        else
        {
            if(newhead==NULL)
            {
                newhead = tail = cur2;
                
            }
            else
            {
                tail->next = cur2;
                tail = tail->next;

            }
            cur2 = cur2->next;
        }
    }
    if(tail == NULL)
    {
        if(list1)
            return list1;
        else
            return list2;
    }
    while(cur1)
    {
        tail->next = cur1;
        tail = tail->next;
        cur1 = cur1->next;
    }
    while(cur2)
    {
        tail->next = cur2;
        tail = tail->next;
        cur2 = cur2->next;
    }
    return newhead;
}

我觉得我的代码最大的问题就是看起来有点繁琐,但是也都是根据测试用例一个一个去尝试,leetcode用起来个测试用例是真舒服。
😊😊那今天的分享就到这里,我们下次再见。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python特殊循环队列_队中元素个数代替队尾指针

对于循环队列来说&#xff0c;如果知道队头指针和队中元素个数&#xff0c;则可以计算出队尾指针。也就是说&#xff0c;可以用队中元素个数代替队尾指针。设计出这种循环队列的判队空、进队、出队和取队头元素的算法。 本例的循环队列包含data 数组、队头指针 front和队中元素…

基于FPGA的图像RGB转HSV实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. RGB与HSV色彩空间 4.2. RGB到HSV转换原理 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的仿真结果导入到matlab中&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a …

【漏洞复现】Viessmann Vitogate远程代码执行(CVE-2023-45852)

漏洞描述 Vitogate 300 2.1.3.0版本的/cgi-bin/vitogate.cgi存在一个未经身份验证的攻击者可利用的漏洞&#xff0c;通过put方法中的ipaddr params JSON数据中的shell元字符实现绕过身份验证并执行任意命令。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络…

低压备自投装置在河北洞庭变电站工程中的应用

安科瑞 崔丽洁 摘 要 随着电力需求的不断增加&#xff0c;电力系统供电可靠性要求越来越高&#xff0c;许多供电系统已具备两回或多回供电线路。备用电源自动投入装置可以*效提高供电的可靠性&#xff0c;该类装置能够在工作电源因故障断开后&#xff0c;自动且迅速地将备用电源…

在Windows或Mac上安装并运行LLAMA2

LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一&#xff1a; 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…

K8S篇之K8S详解

一、K8S简介 k8s全称kubernetes&#xff0c;是为容器服务而生的一个可移植容器的编排管理工具。k8s目前已经主导了云业务流程&#xff0c;推动了微服务架构等热门技术的普及和落地。 k8s是自动化容器操作的开源平台。这些容器操作包括&#xff1a;部署、调度和节点集群间扩展。…

通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现 [附POC]

文章目录 通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 通达OA get_datas.php前台sql注入-可获取数据库session登入后台漏洞复现…

pytorch 中 nn.Conv2d 解释

1. pytorch nn.Con2d 中填充模式 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_mode‘zeros’, deviceNone, dtypeNone) 1.1 padding 参数的含义 首先 &#xff0c;padd N, 代表的是 分别在 上下&…

Windows环境下编译OLLVM源码(VS2022)

windows环境下编译OLLVM 13.x VisualStudio配置下载OLLVM13.xollvm的使用 网上关于windows环境编译ollvm信息比较杂乱&#xff0c;在此编译成功的基础上做一下总结&#xff01; VisualStudio配置 1&#xff0c;正常配置C桌面环境 2&#xff0c;在单个组件中选择用于Windows得C…

05预测识别-依托YOLO V8进行训练模型的识别——对视频中的目标进行跟踪统计

上文中详细介绍了如何对视频进行抽帧,并对帧的图像进行目标识别。但在日常工作中,我们也会遇到需要对目标进行跟踪统计的情况,比如我们需要连续统计某一类目标有多少个的时候,如果单纯从帧中抽取图像的话,系统将无法判断是否为同一目标,从而造成目标数量统计的重复,导致…

webGL项目的开发流程

WebGL (Web Graphics Library) 是一种用于在网页上渲染 2D 和 3D 图形的 JavaScript API。下面是创建 Web 应用程序中使用 WebGL 的流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 了解 WebGL&am…

IDEA重新choose source

大概现状是这样&#xff1a;之前有个工程&#xff0c;依赖了别的模块基础包&#xff0c;但当时并没有依赖包的源码工程&#xff0c;因此&#xff0c;通过鼠标左键点进去&#xff0c;看到的是jar包里的class文件&#xff0c;注释什么的都去掉了的&#xff0c;不好看。后面有这个…

Python GUI标准库tkinter实现与记事本相同菜单的文本编辑器(一)

介绍&#xff1a; Windows操作系统中自带了一款记事本应用程序&#xff0c;通常用于记录文字信息&#xff0c;具有简单文本编辑功能。Windows的记事本可以新建、打开、保存文件&#xff0c;有复制、粘贴、删除等功能&#xff0c;还可以设置字体类型、格式和查看日期时间等。 …

windows服务器限制特定ip访问指定端口(服务器ip白名单)

有些时候我们需要限制特定的ip白名单来访问服务器的指定端口&#xff0c;来防止dos攻击或其他危险访问&#xff0c;我们可以通过防火墙来实现这一需求&#xff0c;下面一起看一下&#xff1a; 1.首先开启防火墙 ps:开启防火墙可能有些端口会无法访问&#xff0c;比如80、443等…

第4版信息系统模考真题

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.下列关于信息的说法&#xff0c;错误的是( )。 A信息是物质、能量及其属性的标示的集合是确定性的增加 B信息是以物质介质为载体&#xff0c;传递和反映世界…

大数据毕业设计选题推荐-市天气预警实时监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【pytest】html报告修改和汉化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…

As Const:一个被低估的 TypeScript 特性

目录 理解 as const TypeScript的期望与现实 解决方案&#xff1a;as const 与 object.freeze 的比较 一个配合 as const 的更清洁的 go to root 函数 使用 as const 提取对象值 基于Vue3.0的优秀低代码项目 你有没有感觉 TypeScript中可能有一些被低估但却非常有用的工…

Python中的del用法

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 python中的del用法比较特殊&#xff0c;新手学习往往产生误解&#xff0c;弄清del的用法&#xff0c;可以帮助深入理解python的内存方面的问题。 python的del不同于C的fre…

css-inpu边框

效果图&#xff1a; input {width: 225px;height: 25px;background-color: #1469bd00;border: #aca9a97d solid 1px;color: white;font-size: 15pt;box-sizing: conte-box; }input:focus {border-style: solid;border-color: #03a9f4;box-shadow: 0 0 15px #03a9f4;outline: …