代码随想录【链表】--->删除倒数第N个节点、链表相交、环形链表

news2024/11/25 7:15:07

⭐️代码随想录⭐️
数组篇:
二分查找
移除数组
有序数组的平方
长度最小的数组
螺旋矩阵
链表篇
链表移除
设计链表
反转链表
交换链表中的节点

文章目录

  • 19. 删除链表的倒数第 N 个结点
    • 思路
    • 代码
  • 面试题 02.07. 链表相交
    • 思路
    • 代码
  • 142. 环形链表 II
    • 思路
      • 判断链表有环
      • 确定环的入口
    • 代码

19. 删除链表的倒数第 N 个结点

题目LeetCode19. 删除链表的倒数第 N 个结点
在这里插入图片描述

思路

这道题的逻辑比较清晰
1. 先找到倒数第n+1个节点
2. 删除倒数第n个节点

为什么要找倒数第n+1个节点而不是倒数第n个节点呢?因为删除第n个节点时我们需要知道该节点的前一个节点在哪里,修改前一个节点的指针域来实现删除该节点,所以关键在于如何寻找倒数第n+1个节点
可以通过快慢指针来寻找倒数第n+1个节点让快指针始终在慢指针前面n+1个长度,这样当快指针走到链表结尾时,慢指针指向的就是倒数第n+1个节点
思考:本题是否需要和之前的提题目一样构造虚拟头节点呢?

使用虚拟头节点会更加方便,因为这题有可能会将头节点删除,这样不能够直接返回head,而使用虚拟头节点可以将真正的头节点和其他的节点统一处理,最后只需要返回dummHead->next即可

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    typedef struct ListNode ListNode;
    //构造虚拟头节点
    ListNode* dummyHead = (ListNode*)malloc(sizeof(ListNode));
    dummyHead->next = head;
    ListNode* fast = dummyHead;
    ListNode* slow = dummyHead;
    //快指针先走n + 1步
    int cnt = 0;
    while (cnt < n + 1)
    {
        //判断删除的节点是否合法
        if (fast == NULL)   return head;
        fast = fast->next;
        cnt++;
    }
    //快慢指针同时移动,直到快指针遍历完
    while (fast)
    {
        slow = slow->next;
        fast = fast->next;
    }
    //slow是待删除节点的下一个节点
    //删除节点
    ListNode* tmp = slow->next;
    slow->next = tmp->next;
    free(tmp);
    //返回新的头节点
    return dummyHead->next;
}

在这里插入图片描述


面试题 02.07. 链表相交

题目LeetCode面试题 02.07. 链表相交

在这里插入图片描述

思路

首先明白一点:链表相交指的是两个链表从某一个节点开始往后所有的节点在物理空间上的地址是一样的,而不是节点的val域一样
如果两链表相交,那么相交的部分最多的情况就是从较短的链表头节点开始相交,所以先让长链表遍历到一个位置使该位置往后的节点数和短链表节点数相同,从该位置开始判断链表节点的空间是否一样,继续判断两链表后一个节点的位置是否一样
如果链表不相交,那么直到curA和curB遍历完后两个指针的值仍然不相交(物理空间不同)
在这里插入图片描述

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    typedef struct ListNode ListNode;
    int lenA = 0;
    int lenB = 0;
    ListNode* curA = headA;
    ListNode* curB = headB;
    //求A链表的节点数
    while (curA)
    {
        lenA++;
        curA = curA->next;
    }
    //求B链表节点数
    while (curB)
    {
        lenB++;
        curB = curB->next;
    }
    curA = headA;
    curB = headB;
    //求两链表长度差
    int gap = lenA - lenB;
    //对齐链表末尾
    if (gap > 0) while (gap--) curA = curA->next;
    else
    {
        gap *= -1;//注意gap为负数的情况
        while (gap--) curB = curB->next;
    }
    //寻找相同节点
    while (curA)
    {
        //找到相交的第一个节点了,后续的节点一定相交
        if (curA == curB)   return curA;
        //两链表的该节点不相交,继续向后遍历
        else 
        {
            curA = curA->next;
            curB = curB->next;
        }
    }
    return NULL;
   
    
}

在这里插入图片描述


142. 环形链表 II

题目LeetCode142. 环形链表 II
在这里插入图片描述

思路

本题的两个关键问题

  • 如何判断链表有环?
  • 如果有环,如何确定环的入口?

判断链表有环

  • 如果链表为空或者链表只有一个节点,那么链表一定无环
  • 如果链表有多个节点,可以通过快慢指针判断链表是否有环

定义快指针fast、满指针slow,快指针一次走2个节点慢指针一次走一个节点如果经过若干步、快慢指针的值相等(指向同一个节点),那么链表一定有环
在这里插入图片描述

理论上来说如果一个链表有环,只需要保证快慢指针的速度差为1个节点,最终快慢指针的值一定会相等,所以这里快指针一次走3个节点、慢指针一次走2个节点也是可以的,但是这样的话可能会导致一次性越过链表尾节点,需要更多的条件来判断,所以这里使用快指针一次走2节点、慢指针一次走1节点是最合适的

确定环的入口

在确定链表一定有环之后,接下来就该确定环的入口了。
假设从头结点到环形入口节点的节点数为x。 环形入口节点到 fast指针与slow指针相遇节点节点数为y。从相遇节点 再到环形入口节点节点数为 z。 如图所示:
在这里插入图片描述
慢指针经过的节点数为x+y,快指针经历的节点数为x+n(y+z)+y,其中n大于等于1因为快指针一定是在环内部走过了一圈才和慢指针相遇,由快指针的速度是慢指针的两倍,所以在相同的时间内有等式
2(x+y)=x+n(y+z)+y,化简可得x=(n-1)(y+z)+z,n大于等于1即可,所以当n=1时(快指针在环内走一圈后和慢指针相遇)x=z,这说明了如果快指针在环内走一圈后和慢指针相遇那么x=z,因此我们可以定义index1指向相遇点,index2指向头节点index1和index2每次走1个节点直到index1和index2的值相等,此时index1指向的就是环形入口节点

当n>1时,x的值一定比z大,所以index1从相遇点需要多转几圈才会和index2重合,但是总归会相遇,所以我们不需要更改代码,在相遇前仍然让index1和index2每次跨过一个节点

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    typedef struct ListNode ListNode;
    //链表为空或者 只有一个节点一定无环
    if ( head == NULL || head->next == NULL) return NULL;
    
    ListNode* fast = head;
    ListNode* slow = head;
    //寻找快慢指针相遇点
    ListNode* index1;

    while (fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
          if (fast == slow)
        {
            index1 = fast;
            break;
        }
    }
    //判断链表是否有环
    if (fast != slow)   return NULL;
    ListNode* index2 = head;
    int x = 0;//入口到头节点的距离
    int y = 0;//相遇点到入口的距离
    //找到环的入口点
   while (index1 != index2)
   {
       index1 = index1->next;
       index2 = index2->next;
   }
   return index1;
}

在这里插入图片描述

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

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

相关文章

ARM 制作简易的根文件系统

一、根文件系统概述 1、为什么需要根文件系统 (1) init 进程这个应用程序&#xff0c;在根文件系统上。 (2) 根文件系统提供了根目录&#xff1a;/。 (3) 内核启动后的应用层配置(/etc 目录)&#xff0c;在根文件系统上。几乎可以认为&#xff1a;发行版 内核 rootfs。 …

Arduino开发之如何连接压力传感器模块?

文章目录0.引言1.压力传感器模块说明2.代码编写3.功能演示0.引言 在利用Arduino开发过程中&#xff0c;若需知道设备能感知到受到外部按压&#xff0c;设备可以通过压力传感器模块来感知周围环境。本文在【Arduino如何进行开发&#xff1f;】基础上&#xff0c;借鉴现有网络资料…

数字营销新宠:探究2023年YouTube网红营销的核心趋势和商业价值

2023年&#xff0c;YouTube网红营销已经成为全球广告营销行业的重要组成部分。YouTube作为全球最大的视频分享平台&#xff0c;每月活跃用户数达到了20亿&#xff0c;其中有超过100万的YouTube网红在平台上分享自己的创意和想法。在这篇文章中&#xff0c;Nox聚星将和大家探讨2…

Visual Studio如何使用Qt开发桌面软件?

文章目录0.引言1.开发环境配置2.编写第一个Qt程序0.引言 笔者熟悉的第一门编程语言是C#&#xff0c;当初本科毕业设计需要进行Qgis的二次开发&#xff0c;本想利用C#编程&#xff0c;但网上资料较少&#xff0c;多是利用Qt进行Qgis的二次开发&#xff0c;Qt是利用C编程&#xf…

如何将aac转化为mp3,4种常用方法

aac是高级音频编码格式之一&#xff0c;支持多声道、解析度高&#xff0c;与mp3相比&#xff0c;aac格式的音质更佳&#xff0c;文件更小。在手机上录音时&#xff0c;保存下来的录音文件通常是AAC格式的。虽然aac格式有很多优点&#xff0c;但是&#xff0c;在不同的设备上&am…

POST请求与GET请求

get和post是HTTP协议中的两种发送请求的方法 HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议 一、get请求与querystring get请求即客户端向server服务端请求数据&#xff0c;如&#xff1a;获取文章列表的分页码等 通过queryString来获取数据&#xff0c;如&#xff1…

设计模式 -- 模板方法模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

java生成随机字符串的方法

今天我们来学习下随机数的生成&#xff0c;随机数就是不确定的数&#xff0c;它可以是任意一个整数或者字符串。下面就让我们一起来学习下随机字符串的生成吧。 首先&#xff0c;我们需要先定义一个名为 str的数组&#xff0c;并将它作为输入文件。 1、使用 Java中的 str作为输…

传播的最大能量场来自私域的裂变——“春生百味”品牌营销裂变活动复盘后记

关于大宗家电等耐用品品牌想要精准触达潜在用户&#xff0c;如何实施传播策略&#xff1f; 刚刚与方太品牌方复盘完3月份“春生百味”关于营销裂变直播活动的整体效果&#xff0c;我们借此次整体案例实施过程的梳理&#xff0c;以分享几个裂变过程中的关键点。 传播的最大能量…

React styled-components(二)—— props、attrs属性

styled-components props、attrs属性propsprops 穿透添加 attrs 属性获取 state 中的样式变量控制样式通过 props 控制样式通过 css 控制样式props props 穿透 styled-components 可以 props 穿透&#xff0c;把属性穿透到元素中。 通常&#xff0c;用 css 的 input 组件实现…

【Python】【进阶篇】十七、Python爬虫实现实时翻译

目录十七、Python爬虫实现实时翻译17.1 JS代码slat与sign17.2 Python代码表示参数17.3 完整程序实现十七、Python爬虫实现实时翻译 YD翻译是以异步方式实现数据加载的&#xff0c;要实现数据抓取&#xff0c;其过程极其繁琐。 上一节《Python爬虫的浏览器实现抓包》&#xff…

使用LeafLet叠加Geoserver wms图层到已有底图的方法

背景 随着现代城市交通建设的飞速发展&#xff0c;各个城市的地铁路线和地铁站点也是越来越多。地铁极大的方便了广大人民的交通出行。作为Giser&#xff0c;经常会遇到需要将一份shp数据在地图上展示&#xff0c;甚至需要在网页端进行浏览的需要。把shp这种空间矢量数据进行we…

数据库笔记Ch04----概念数据库的设计(1)

前三章我们学习了如何使用DBMS我们学会了增删改查&#xff0c;插入数据库&#xff0c;创建视图... 这一章是我们的数据库刚刚建立&#xff0c;只有一个需求&#xff0c;需要根据用户的需求来创建数据库&#xff0c;每个表有哪些属性&#xff0c;参照关系是什么&#xff0c;主键…

一.Jetpack全套

Jetpack全套一.Jetpack介绍1.特性&#xff1a;2.分类&#xff1a;二.应用架构三.LifeCycle:1.简介2.简单使用3.实战&#xff1a;Dialog内存泄漏四.VideModel1.介绍2.简单使用3.AndroidViewModel使用4.使用viewmodel实现fragment直接数据共享五.LiveData1.介绍2.常用方法3.使用场…

车载 OTA技术概念

1 OTA技术概念 随着高级辅助驾驶的发展和自动驾驶的引入&#xff0c;汽车变得越来越智能&#xff0c;这些智能汽车被软件控制&#xff0c;装有巨量的软件程序&#xff0c;当出现一个软件程序问题或者更新时&#xff0c;如果按照传统的解决方式&#xff0c;那都将是一项很繁重的…

【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。⛳座右铭&#…

云开发--实现发送邮件+短信+链接跳转小程序功能

目录 1、小程序实现发送邮件 准备一个qq邮箱&#xff0c;并启动SMTP服务 确定小程序云开发环境&#xff0c;并新建云函数 2、小程序实现发送短信 确定应用 确定签名 确定模板 编写云函数-发送短信 3、链接跳转小程序 H5 配置 生成 URL Link 学习记录&#xff1a; …

【获奖案例巡展】科技向善之星——中航电梯5G+大数据管理平台

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目&#xff0c;星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动&#xff0c;旨在为各行业提供更多的优秀产品案例&#xff0c;彰显技术改变世界的力量&#xff0…

网络编程(python)

文章目录一、网络基础&#xff08;IP&#xff0c;端口&#xff0c;TCP等&#xff09;二、TCP网络应用可开发流程三、HTTP协议和静态Web服务器四、搭建Python自带静态Web服务器一、网络基础&#xff08;IP&#xff0c;端口&#xff0c;TCP等&#xff09; IP地址&#xff1a;标识…

企业的数据中台到底指的是什么?_光点科技

随着数据技术的不断发展和企业数据应用的广泛应用&#xff0c;越来越多的企业开始将数据中台作为数字化转型的核心战略之一。那么&#xff0c;企业的数据中台到底指的是什么呢&#xff1f; 数据中台是一种以数据为核心的企业数字化转型架构&#xff0c;旨在通过数据的汇聚、整合…