Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

news2024/11/24 19:06:07

吾心信其可行,则移山填海之难,终有成功之日。                           --孙中山
目录

🍉一.删除链表的倒数N个结点

🌻1.双指针

🍁2.求链表的长度

🌸二.删除链表的中间的结点


🍉一.删除链表的倒数N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

做题链接

🌻1.双指针

这题我们同样使用双指针的方法,我们先定义一个fast指针和slow指针,它们都指向head。

第一步:先判断fast为不为空,不为空,n就减1,fast再走一步。依次循环,直到n减到0,即退出循环。
第二步:然后slow指针和fast再同时移动,直到fast走到链表的尾,此时slow即要找到的指针,即要删除的指针。


但是这样做只是找到你要删除的结点,这题你不仅要找到倒数的N个结点,还要把这个结点的前后结点给链接起来。 

大体方法还是这个方法,但是可能fast和slow初始指向链表的位置不同,这题我们创建一个哨兵位的头结点来实现开始fast和slow指针指向phead,我们还是通过画图来理解。


直接上代码: 

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
    struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
    phead->next = head;
    struct ListNode* fast = phead, * slow = phead;
    while (n--)
    {
        fast = fast->next;//fast先走
    }
    while (fast->next)
    {
        fast = fast->next;//此时两个指针遍历链表
        slow = slow->next;
    }
    slow->next = slow->next->next;
    struct ListNode* next = phead->next;//保存哨兵位的下一个结点
    free(phead);//释放哨兵结点
    return next;
}

这题的难点就是该如何把要删除结点的前后结点链接起来,这就需要仔细的把fast和slow初始的位置给放对才行。

🍁2.求链表的长度

我们先创建一个函数遍历链表,把链表的长度len给算出来。也是和上面一样,我们还是创建一个哨兵位的头结点phead,然后使用一个cur指针指向phead,然后cur走len-n个结点,就找到了要删除结点的前一个结点,然后cur->next=cur->next->next即可

int longlinked(struct ListNode*head)
{
    int len=0;
    while(head)
    {
        len++;
        head=head->next;
    }
    return len;
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
     int len=longlinked(head);
     struct ListNode*phead=(struct ListNode*)malloc(sizeof(struct ListNode));
     phead->next=head;
     struct ListNode*cur=phead;
     int i=0;
     while(i<len-n)
     {
         cur=cur->next;
         i++;
     }
    cur->next=cur->next->next;
    struct ListNode*second=phead->next;
    free(phead);
    phead=NULL;
    return second;
}

🌸二.删除链表的中间的结点

给你一个链表的头节点head 。删除 链表的中间节点 ,并返回修改后的链表的头节点head 。

长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。

  • 对于 n = 1、2、3、4 和 5 的情况,中间节点的下标分别是 0、1、1、2 和 2 。

示例 1:

输入:head = [1,3,4,7,1,2,6]
输出:[1,3,4,1,2,6]
解释:
上图表示给出的链表。节点的下标分别标注在每个节点的下方。
由于 n = 7 ,值为 7 的节点 3 是中间节点,用红色标注。
返回结果为移除节点后的新链表。 

示例 2: 

 

输入:head = [1,2,3,4]
输出:[1,2,4]
解释:
上图表示给出的链表。
对于 n = 4 ,值为 3 的节点 2 是中间节点,用红色标注。

 示例 3:

输入:head = [2,1]
输出:[2]
解释:
上图表示给出的链表。
对于 n = 2 ,值为 1 的节点 1 是中间节点,用红色标注。
值为 2 的节点 0 是移除节点 1 后剩下的唯一一个节点。

做题链接

之前我们就写了找中间结点的链表题,但是上次那个只是找到中间结点即可,使用快慢指针来实现,这题就是那个题的变形,找到中间结点给删除掉,然后把中间结点的前后给链接起来,我们同样是创建一个哨兵位的结点,然后使用快慢指针来实现。fast指针指向head,而slow指针指向phead。

当fast指向链表的尾时,slow这时指向中间结点的前一个,然后链接起来就是。

struct ListNode* deleteMiddle(struct ListNode* head){
      if(head->next==NULL)
        return NULL;
      struct ListNode*phead=(struct ListNode*)malloc(sizeof(struct ListNode));
      phead->next=head;
      struct ListNode*fast=head,*slow=phead;  
      while(fast&&fast->next)
      {
          slow=slow->next;
          fast=fast->next->next;
      }
      slow->next=slow->next->next;
    struct ListNode*next=phead->next;
    free(phead);
    phead=NULL;
    return next;
}

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

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

相关文章

DataGridView 真·列头不高亮 真·列头合并

高亮BUG VB.Net&#xff0c;在 .NET Framework 4.8 的 WinForm 下(即不是 WPF 的绘图模式、也不是 Core 或 Mono 的开发框架)&#xff0c;使用 DataGridView 行模式&#xff0c;还是有个列头表现为高亮显示&#xff1a; 查找各种解决方式: 设置 ColumnHeadersDefaultCellSty…

Python3语法笔记(前篇)

文章目录 前言基础杂项变量和数据变量与运算数值字符串列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;和range序列类型&#xff08;sequence types&#xff09;和切片&#xff08;slicing&#xff09;集合&#xff08;set&#xff09;和字典&#xff08…

PS批量给图片加水印

一、打开PS&#xff0c;导入图片 点击菜单栏-文件-打开-载入一张需要设置文字水印的图片 二、点击菜单栏-窗口-动作&#xff0c;打开Photshop的动作组工作台窗口 先点击新建组图标新建一个组类别&#xff0c;再点击新建动作图标新建一个动作&#xff0c;新建后自动开始录制 …

DASFAA 2023|创邻周研博士分享前沿图数据库观点

4月17-20日&#xff0c;2023年第28届高级应用数据库系统国际会议&#xff08;DASFAA2023&#xff09;在天津成功举行。创邻科技CTO周研博士受邀参会&#xff0c;围绕Galaxybase国产高性能图数据库进行精彩分享。 DASFAA 2023由DASFAA指导委员会&#xff08;DASFAA Steering Co…

CVPR 2023 | 语义分割新范式:点监督遇上隐式场

密集预测(dense prediction)网络是解决诸如语义分割和图像本征分解(intrinsic decomposition)等场景理解问题的基本框架。现有工作[1-2] 通常使用像素级标注作为训练密集预测模型的监督。但是像素级别的密集标注非常昂贵&#xff0c; 对一些任务也无法给出精准的像素标注&#…

Linux-初学者系列3——虚拟光驱使用mount挂载操作

虚拟光驱使用mount挂载操作 一、mount挂载操作1、利用图形将光盘镜像文件&#xff0c;放入光驱设备中2、找到Linux光驱设备&#xff08;青色&#xff09; 1、挂载光盘和分区mount命令语法&#xff1a;示例&#xff1a;卸载&#xff08;注意事项&#xff09; 二、Linux快捷键 一…

Vue(绑定样式、条件渲染、列表渲染)

一、绑定样式 1. class绑定样式名 标签中使用 :class"xxx" xxx可以是字符串&#xff0c;对象&#xff0c;数组 字符串&#xff1a;适用于类名不确定&#xff0c;动态获取 数组&#xff1a;适用于绑定多个样式&#xff0c;个数不确定&#xff0c;字数不确定 对象&…

ProteinGAN扩展蛋白质序列空间

为了更广泛的医学应用&#xff0c;为催化任何所需的化学反应而重新设计蛋白质是蛋白质工程的重点。因此作者开发了ProteinGAN&#xff0c;这是一种基于自注意力的生成对抗网络&#xff0c;能够学习自然蛋白质序列的多样性&#xff0c;并生成功能性蛋白质序列。 来自&#xff1…

基于GEE平台的植被覆盖度(FVC)像元二分法计算

一、植被覆盖度计算方法 植被覆盖度FVC&#xff08;Fractional Vegetation Cover&#xff09;定义为单位面积内绿色植被冠层垂直投影面积所占比例。FVC是衡量地表植被状况的重要指标之一&#xff0c;也是区域生态系统环境变化的重要指示&#xff0c;对水文、生态、区域变化等都…

线程同步方式之一互斥锁

线程同步的4种方式&#xff1a;互斥锁、条件变量、读写锁、信号量 了解概念-临界资源、互斥、临界区、原子性 回想一下在信号量那部分提起过的几个概念&#xff0c;将多个执行流串行安全访问的共享资源称为临界资源&#xff0c;多个执行流中访问临界资源的代码所在的地址空间…

第4章 数据结构之“队列”

队列简介(queue) 1.一个先进先出的数据结构 2.javascript中没有这个数据结构&#xff0c;但是可以使用array实现队列的所有功能。 3.队列常用操作&#xff1a;push&#xff0c;shift&#xff0c;获取队列头部的元素&#xff1a;queue[0] const queue []// 入队&#xff1a; …

网络基础之网络传输基本流程

网络基础 此小节介绍网络基础概念 首先要明确的是 网络是层状结构&#xff01;分层->OP->解耦 网络发展&#xff1a;最早的时候&#xff0c;每台计算机之间是相互独立的。后续发展到网络互联&#xff0c;就是将多台计算机连接在一起&#xff0c;完成数据共享。 协议&…

Jmeter配置元件之csv数据文件配置

一、csv简介 csv是非常通用的一种文件格式&#xff0c;适用于批量导入数据到接口参数中&#xff0c;或者保存测试结果都可以使用csv数据文件(jmeter不仅仅支持这一种读取文件的方式)&#xff0c;csv数据一行即为数据表的一行&#xff0c;多个字段用逗号隔开。 登录接口 …

A+CLUB管理人支持计划第四期 | 香农投资

免责声明 本文内容仅对合格投资者开放&#xff01; 私募基金的合格投资者是指具备相应风险识别能力和风险承担能力&#xff0c;投资于单只私募基金的金额不低于100 万元且符合下列相关标准的单位和个人&#xff1a; &#xff08;一&#xff09;净资产不低于1000 万元的单位&…

Vue3技术7之toRaw与markRaw、customRef、provide与inject、响应式数据的判断、组合式API的优势分析

Vue3技术7 toRaw与markRawtoRawApp.vueDemo.vue markRawDemo.vue 总结 customRefApp.vue总结 provide与inject目录结构App.vueChild.vueSon.vue总结 响应式数据的判断App.vue总结 组合式API的优势配置式的API存在的问题组合式API的优势 toRaw与markRaw toRaw App.vue <te…

HDR tone mapping介绍

文章目录 HDR and tone mapping1.什么是HDR&#xff1f;2.为什么需要HDR&#xff1f;3.hdr文件格式4.tone mapping4.1 aces tone mapping4.2 Fast Bilateral Filtering for the Display of High-Dynamic-Range Images 5 参考 HDR and tone mapping 1.什么是HDR&#xff1f; 就…

nginx + springboot 实现限流

1.spring项目打成jar包后&#xff0c;运行起来 &#xff1a;例如我启动项目 ip 端口号&#xff1a;172.168.0.217:8090 2.修改nginx配置&#xff0c;增加如下配置 nginx 中有两个主要的指令可以用来配置限流&#xff1a;limit_req_zone 和 limit_req upstream myserver{serve…

面试篇:Redis

一、缓存穿透 1、缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库。即&#xff1a;大量请求根本不存在的key 2、查询流程 3、出现原因 业务层误将缓存和库中的数据删除了&#xff0c;也可能是有人恶…

3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机

3台服务器StarVCenter&#xff0c;搭建“超融合云平台”-完美体验-跑100台虚拟机 我们通常讲的“超融合&#xff08;HCI&#xff09;”是一种云平台基础架构方案&#xff0c;它无需专用的存储设备&#xff0c; 每台服务器既承担计算又存储数据&#xff0c; 只需增加服务器&…

SpringMVC-RESTful架构风格

目录 RESTful架构风格 1、RESTful概述 2、RESTful的六大原则 3、RESTful的实现 4、HiddenHttpMethodFilter RESTful风格的CRUD 1、环境搭建 2、功能需求 3、功能&#xff1a;访问首页 4、功能&#xff1a;查询所有数据 5、功能&#xff1a;删除一条数据 6、功能&…