链表之第一回

news2024/12/25 12:42:07

在这里插入图片描述

欢迎来到我的:世界

收录专栏:链表

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 前言
    • 第一题:删除链表的倒数第n个节点
    • 第二题:链表的中间结点
    • 第三题:合并两个排序的链表
  • 总结

前言

  • 在这里写的是有关链表的落坑题,详细写了我落坑的全过程,相信大家也都掉过坑,该专栏我会持续更新,感谢铁子们的支持。
    -———————对过程全力以赴,对结果淡然处之

第一题:删除链表的倒数第n个节点


地址: oj题地址


在这里插入图片描述

解题思路:

  • 1.暴力遍历:
    我们先遍历一遍,找到该链表中有多少个节点(第一次遍历),然后再第二次遍历找到倒数第n个节点,再进行删除,再返回原地址。这种方法可以说是这道题的比较简单的实现方法。再这里我想讲一下另一种方法:

  • 2.三指针法:
    先创造三个指针,tail指针,sur指针,dst指针,而sur,dst指针一开始指向是链表的起始地址,tail指针是指向sur指针前一个字节的地址,这就需要重新开辟一块空间其中的next 可以找到sur的地址;
    起始时物理图在这里插入图片描述
    注意:链表因为地址不是相连的,其地址可以看作是随机的,图中的地址都是我随便编的,只是为了方便更容易观察

  • 思路:先让dst指针向后走n个节点,这样的话,dst指针和sur指针就相距了n个节点,然后让这三个指针一起向后一次移动一个节点,直到dst指针指向空指针,这样的话,sur所指的就是倒数第n个节点(这一步观念很重要,一定要想清楚),这个时候有要删除的那个节点地址,也有该节点上一个节点的地址tail指针所指,那就可以很好的完成删除。
    以上的是思路,下面来进行实现

结束时的物理图:
在这里插入图片描述

struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {
    // write code here

    //sur指针是指向要删除的那个节点,dst是与sur保持间距n的,tail是sur前一个节点
    struct ListNode* sur = head, *dst = head;
    struct ListNode*tail =(struct ListNode*)malloc(sizeof(struct ListNode));
    tail->next=sur;
    //先让dst指针走n个节点
    while (n--) {
        dst = dst->next;
    }
    while (dst) {
        //三个指针一起出发,tail指针始终指向sur指针前前一个节点 
        dst = dst->next;
        sur = sur->next;
        tail = tail->next;

    }
    //删除
    if (head == sur) {
        //如果sur没动说明要删的就在第一个
        head = head->next;
        sur = head->next;
    } else {
        //要删的只要找到sur指针的前一个节点,就可以让sur后一个节点与之相连
        tail->next = sur->next;
    }
    return head;
}

第二题:链表的中间结点


地址:oj地址


在这里插入图片描述
解题思路:

  • 1.暴力遍历法:
    根据这道题的正常思路,肯定是先遍历一遍该链表的所有结点的个数,就可以得出中间点了,最后返回指向该点的地址;这种方法很寻常,在这里我就不具体讲了,我想具体讲下一种方法:
  • 2.快慢指针法:
    该方法思路是:先设置两个指针:slow,fast,分别是快慢指针,首先两个指针都是指向链表的起始位置,slow向下一个结点移动,而fast向下两个结点移动,直到fast指针停下,那fast指针什么时候停呢,肯定有不同情况,如果链表的结点时偶数时,这时fast 走到空为止,而如果链表总结点时奇数时,这时fast走到尾结点停下。
    ----如为奇数时:逻辑图:
    第一步:在这里插入图片描述
    第二步:
    在这里插入图片描述
    第三步
    在这里插入图片描述

若为偶数时:
逻辑图:
第一步:在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述
第四步:
在这里插入图片描述

代码:

struct ListNode* middleNode(struct ListNode* head ) {
    // write code here
	//设置快慢指针
    struct ListNode*sur=head,*dst=head;
	//当dst指针为空或dst指向的next为空就停下
    while(dst && dst->next)
    {
        sur=sur->next;
        dst=dst->next->next;
    }
	
    return sur;
}

第三题:合并两个排序的链表


地址:oj地址


在这里插入图片描述
解题思路:

首先链表和顺序表不同,有些思路是行不通的;但也有其优点,链表是由一个一个结点连起来的,可以随时拆下来的;
用归并的方法,我们可以先创造两个指针,让需要归并的两组链表由起始位置进行比较,较小值尾插入一个指针,另一个指针是找到需要插入的前一个结点,好方便尾插;
在这里插入图片描述
比较1<2,尾插入 1 ,如果是第一次插入,应该先让head指针和tail指针同时指向 1 的地址;如果不是第一次插入,那就是应该pHead1的地址给tail->next,然后让tail指针指向tail->next,最后让pHead1指向下一个结点;
在这里插入图片描述

  • 然后是 2<3 ,尾插入2的地址;跟上面的步骤一样;
    注意:这里之后就不是第一次插入,记得让tail指针指向tail的下一个结点;

    在这里插入图片描述
    后面的步骤几乎是一样的;
    直到有一个链表没有了,在将剩下链表直接进行尾插入,就可以了;
    在这里插入图片描述
    在这里插入图片描述
    最后返回head指针;
    但是这就对了么?
    不是的,还有一步我们忘记了,如果两个链表其中一个是空,那这个程序的结果肯定报错,所以我们还要在最开始进行判断,如果有其中一个为空,则直接返回另一个链表;

代码:

struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    // write code here
    //如果其中一个链表为空,则直接返回另一个链表
    if(pHead1==NULL)
        return pHead2;
    if(pHead2==NULL)
        return pHead1;
         
    struct ListNode* head = NULL, *tail = NULL;
    //判断哪个链表先为空,就跳出去
    while (pHead1 && pHead2) {
        if (pHead1->val < pHead2->val) {
            if (tail == NULL) {
                //第一次尾插
                head = tail = pHead1;
                
            } else {
                //不是第一次尾插
                tail->next = pHead1;
                tail=tail->next;
                
            }
            //让篇pHead1指针找到下一个结点
            pHead1 = pHead1->next;
            
        } else {
            if (tail == NULL) {
                //第一次尾插
                head = tail = pHead2;
            } else {
                //不是第一次尾插
                tail->next = pHead2;
                tail=tail->next;
            }
            //让篇pHead2指针找到下一个结点
            pHead2 = pHead2->next;
        }
    }
    //判断哪个链表先为空,然后让另一个链表直接尾插入;
if(pHead1)
    tail->next=pHead1;

if(pHead2)
    tail->next=pHead2;

    return head;
}

总结

在这里感谢老铁们的观看,在这里小孩谢谢大家的支持,以上的题目都是基于小孩现在的能力来说,如果还有更好的方法的老铁,可以在评论区里面一起进行讨论哦,在后面随着小孩的知识储备越多,小孩肯定还会加以优化优化!!


到了最后:
我还想告诉你:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

相关文章

Apache Dubbo 云原生可观测性的探索与实践

作者&#xff1a;宋小生 - 平安壹钱包中间件资深工程师 Dubbo3 可观测能力速览 Apache Dubbo3 在云原生可观测性方面完成重磅升级&#xff0c;使用 Dubbo3 最新版本&#xff0c;你只需要引入 dubbo-spring-boot-observability-starter 依赖&#xff0c;微服务集群即原生具备以…

Gradio部署应用到服务器不能正常访问

用Gradio部署一个基于ChatGLM-6B的应用&#xff0c;发布到团队的服务器上&#xff08;局域网&#xff0c;公网不能访问&#xff09;&#xff0c;我将gradio应用发布到服务器的9001端口 import gradio as gr with gr.Blocks() as demo:......demo.queue().launch(server_port90…

视频集中存储安防监控平台EasyCVR优化AI硬件接入时的通道显示异常问题

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…

NPCon2023 AI模型技术与应用峰会:参后感

8月12日&#xff0c;参加了在北京皇家格兰云天大酒店召开的“全链路搭建人工智能研发基础”会议。此次会议汇集了众多人工智能领域的顶尖技术专家&#xff0c;他们就人工智能基础设施、计算能力资源以及模型训练等核心议题展开了深入的研讨。 1.主题以及收获 主题1.由千芯科技…

网络编程555

上传代码 #include <stdio.h>//客户端 #include <string.h> #include <stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<head.h> #define PORT 69 #define IP "192.168.124.57"…

Arduino之TFT_eSPI驱动彩色LCD屏

一、TFT_eSPI库简介 1.1 安装TFT_eSPI库 在User_Setup.h中进行个人屏幕参数的配置&#xff1a; User_Setup.hTFT驱动板备注TFT_MISO无 TFT_MOSISDA TFT_SCLKCLK TFT_CSCS液晶屏片选信号&#xff0c;低电平使能TFT_DCRS液晶屏寄存器/数据选择信号TFT_RSTRST液晶屏复位信号TF…

通达信一目均衡表指标选股公式,又称云图指标

一目均衡表&#xff08;Ichimoku Kinko Hyo&#xff0c;又称一目均衡图、云图指标&#xff09;是由日本记者兼股市专家一目山人发明的&#xff0c;被广泛用于股票、外汇、期货等金融市场的趋势分析和支撑阻力位的判断。一目均衡表提供了一种综合性的视角&#xff0c;结合了多个…

LC-相交链表(解法1)

LC-相交链表&#xff08;解法1&#xff09; 链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在…

Linux交叉编译opencv并移植ARM端

Linux交叉编译opencv并移植ARM端 - 知乎 一、安装交叉编译器 目标平台为arm7l&#xff0c;此为32位ARM架构&#xff0c;要安装合适的编译器 sudo apt install arm-linux-gnueabihf-gcc sudo apt install arm-linux-gnueabihf-g注意&#xff1a;64位ARM架构的编译器与32位ARM架…

微服务与Nacos概述-6

RBAC 模型 RBAC 基于角色的访问控制是实施面向企业安全策略的一种有效的访问控制方式。 基本思想是&#xff0c;对系统操作的各种权限不是直接授予具体的用户&#xff0c;而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当…

使用 BERT 进行文本分类 (02/3)

​ 一、说明 在使用BERT&#xff08;1&#xff09;进行文本分类中&#xff0c;我向您展示了一个BERT如何标记文本的示例。在下面的文章中&#xff0c;让我们更深入地研究是否可以使用 BERT 来预测文本是使用 PyTorch 传达积极还是消极的情绪。首先&#xff0c;我们需要准备数据…

利用POM完成脚本分离实现企业级自动化(POM设计模式+页面的框架封装+测试报告截图)

利用POM完成脚本分离实现企业级自动化&#xff08;POM设计模式页面的框架封装测试报告截图&#xff09; 项目-测试-手工测试 项目-测试-手工测试 1.了解需求&#xff1b; 2.编写测试用例&#xff08;开始&#xff09;——功能测试组会去做的事情 3.执行测试用例——发送测试报…

vue中router路由的原理?两种路由模式如何实现?(vue2) -(下)

上一期我们说到了如果想要实现一个路由嵌套&#xff0c;那么就需要判断传递实例化路由时的那个路由信息是否存在children属性&#xff0c;如果有children说明它是二级路由&#xff0c;我们还需要去递归判断&#xff0c;因为它不一定只有一个子路由&#xff0c;接下来实现一下路…

【第三阶段】kotlin语言的substring

const val INFO"kotlin java" fun main() {val indexOfINFO.indexOf(j)//左包右不包//0,indexOf等价于0 until indexOf ktolin常用0 until indexOf 方式println(INFO.substring(0,indexOf))println(INFO.substring(0 until indexOf))}执行结果

Android Framework 动态更新插拔设备节点执行权限

TF卡设备节点是插上之后动态添加&#xff0c;所以不能通过初始化设备节点权限来解决&#xff0c;需要监听TF插入事件&#xff0c;在init.rc 监听插入后动态更新设备节点执行权限 添加插拔TF卡监听 frameworks/base/services/core/java/com/android/server/StorageManagerServic…

YOLOv5基础知识入门(6)— 激活函数(Mish、Sigmoid、Tanh、ReLU、Softmax、SiLU等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。激活函数&#xff08;Activation functions&#xff09;对于人工神经网络模型去学习、理解非常复杂和非线性的函数具有十分重要的作用。YOLOv5模型训练过程中即使用了激活函数&#xff0c;可以改善模型的训练速度和准确性。…

SpringCloud实用篇7——深入elasticsearch

目录 1 数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法1.2.5.小结 1.3 RestAPI实现聚合1.3.1 API语法1.3.2 业务需求1.3.3 业务实现 2 自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 实现…

vue3-router

一、路由 &#xff08;1&#xff09;通过 URL 区分路由的机制上&#xff0c;有两种实现方式&#xff1a; hash 模式&#xff1a;通过 URL 中 # 后面的内容做区分&#xff0c;我们称之为 hash-router&#xff1b; history 模式&#xff1a;在这种方式下&#xff0c;路由看起来和…

C++_模板进阶_非类型模板参数_模板特化_分离编译

一、非类型模板参数 模板参数&#xff0c;分为类型形参和非类型形参。 类型形参就是在模板中跟在typename和class之后的参数类型名称&#xff0c;非类型形参就是用一个常量作为类模板或者函数模板的一个参数&#xff0c;在类模板和函数模板中&#xff0c;可以将该参数当作常量…

第三方软件安全测评如何收费,安全测试包括哪些测试项?

近年来&#xff0c;随着全球范围内网络安全事件的频发&#xff0c;第三方软件安全测评的需求也日益增长。软件安全对于企业的重要性不言而喻&#xff0c;那么如何收费和可做测试项就成了企业最为关注的问题&#xff0c;小编将就以上问题作出以下简析。 一、第三方软件安全测评…