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

news2024/11/25 13:11:54

题目:

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

示例:

代码思路:

//方法一:

class Solution {  
public:  


    //使用双指针算法
    ListNode* removeNthFromEnd(ListNode* head, int n) {  
        if (head == nullptr) return nullptr;  // 如果链表为空,直接返回  
  
        // 使用一个哨兵位节点(dummy node)简化头节点被删除的情况  
        ListNode* dummy = new ListNode(0);  
        //哨兵位节点的创建,哨兵位节点指向的是链表的头结点
        dummy->next = head;  
  
        //设立快慢指针
        ListNode* fast = dummy;  
        ListNode* slow = dummy;  
  
        // 先让快指针向前移动n+1步  
        for (int i = 0; i <= n; ++i) {  
            fast = fast->next;  
        }  
  
        // 快慢指针同时移动,直到快指针到达链表末尾  
        while (fast != nullptr) {  
            fast = fast->next;  
            slow = slow->next;  
        }  
  
        // 此时slow指向要删除的节点的前一个节点  
        ListNode* temp = slow->next;  
        slow->next = slow->next->next;  // 删除节点  
  
        // 释放哨兵位节点  
        ListNode* newHead = dummy->next;  
        delete dummy;  
  
        // 如果删除的是头节点,newHead已经是指向新头节点的指针  
        return newHead;  
    }  
};



方法二:

class Solution {
public:

   //算出链总长度,再利用链表倒数第n个节点的关系,遍历节点到第n个节点之前的位置
   //随后将这个节点的前一个节点链接到,这个节点的后一个节点,然后删除该节点
    int getLength(ListNode* head) {
        int length = 0;
        while (head) {
            ++length;
            head = head->next;
        }
        return length;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {

       // new ListNode(0,head)的意思是创建一个初始值是0的节点,这个节点的next指针指向head
        ListNode* dummy = new ListNode(0, head);

        int length = getLength(head);

        ListNode* cur = dummy;

        //根据计算,第n个节点的在链表上的位置是 链表长度 - n+1的位置,
        //所以这里遍历到这个位置之前即可
        for (int i = 1; i < length - n + 1; ++i) {
            cur = cur->next;
        }

        //该节点的 前一个节点 和 该节点的后一个节点链接
        cur->next = cur->next->next;
        
        //对哨兵位进行处理
        ListNode* ans = dummy->next;

        //删除哨兵位
        delete dummy;
        return ans;
    }
};

题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 

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

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

相关文章

通信工程学习:什么是MRF多媒体资源功能、MRFC多媒体资源功能控制、MRFP多媒体资源功能处理

一、MRF多媒体资源功能 MRF&#xff08;Multimedia Resource Function&#xff0c;多媒体资源功能&#xff09;是3G/IMS网络中定义的提供多媒体资源功能的网络实体&#xff0c;它为3G/IMS网络的业务和承载提供媒体能力支持。MRF通过提供丰富的媒体处理功能&#xff0c;如播放声…

MySQL之库和表操作

目录 一&#xff1a;对库的操作 1.创建数据库 2.查看数据库列表 3.显示创建数据库的语句 4.删除数据库 5.字符集与校验集 6.确认当前所处的数据库 7.修改数据库 8.备份和恢复 9.查看连接情况 二:对表的操作 1.创建表 2.查看表 3.删除表 4.修改表 接下来的日…

【进展报告】9.9-9.12

一、进度概述 1、推进关于滤波的相关任务&#xff08;详情见相关文件&#xff09; 二、详情 1、噪声与滤波模块 在师兄 inversionnet 的基础上&#xff0c;在正则化模块前后添加了对应的噪声和滤波模块。 噪声采用的是最基本的高斯噪声和椒盐噪声&#xff0c;关于其他…

OpengGL学习-显示三维形状

本文介绍了OpenGL创建三维图形的几个示例程序。并附有OpenGL创建三维形状的基础示例代码。本文还介绍了OpenGL基础知识&#xff0c;并对Vulkan做了简介。Vulkan性能更强大&#xff0c;但对开发技术人员要求更高&#xff0c;对兼容性的风险和工作量要有充分的认识。兼容性不仅存…

通信工程学习:什么是MGCF多媒体网关控制功能

MGCF&#xff1a;多媒体网关控制功能 MGCF&#xff08;Media Gateway Control Function&#xff0c;多媒体网关控制功能&#xff09;是IP多媒体子系统&#xff08;IMS&#xff09;网络中的一个关键组件&#xff0c;主要负责实现IMS网络和传统电路交换网络&#xff08;如PSTN、I…

2024年【建筑焊工(建筑特殊工种)】考试技巧及建筑焊工(建筑特殊工种)作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑焊工(建筑特殊工种)考试技巧考前必练&#xff01;安全生产模拟考试一点通每个月更新建筑焊工(建筑特殊工种)作业考试题库题目及答案&#xff01;多做几遍&#xff0c;其实通过建筑焊工(建筑特殊工种)在线考试很简…

springboot 项目获取 yaml/yml (或 properties)配置文件信息

文章目录 springboot 项目获取配置文件信息前言1、 Autowired 注入 Environment类2、基础用法&#xff0c;使用Value注解直接注入配置信息3、进阶方法&#xff08;推荐使用&#xff09;拓展&#xff1a;springboot 集成配置中心 - 以 Apollo 为例 springboot 项目获取配置文件信…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提…

写的一致性问题之失效模式

文章目录 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a;1.1、高并发情况下分析出现的问题 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a; 此时删除redis成功&#xff0c;写入mysql成功&#xff0c;此时redis是空&#xff0c;mysql是新数据。此时删除redis…

财富通公司开发洗车小程序有哪些用处?

洗车小程序具有多种用处&#xff0c;主要体现在以下几个方面&#xff1a; 1.便捷预约服务&#xff1a;用户可以通过洗车小程序轻松预约洗车服务&#xff0c;无需亲自前往洗车店或打电话预约&#xff0c;节省了时间和精力。同时&#xff0c;小程序通常提供多种预约时间选项&…

Java进阶13讲__补充1/2

单元测试、反射、注解、Lombok 1. 单元测试 1.1 Junit单元测试框架 1.2 Junit框架入门 package com.itheima.a_单元测试;import org.junit.Test;public class SpringUtilTest {Testpublic void testPrintNumber() {StringUtil.printNumber("Jack");StringUtil.pri…

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…

【Python系列】理解 Python 中的时间和日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

测试开发基础——测试分类

四、测试分类 1. 按照测试目标分类 1.1. 界面测试 肉眼看到的任何元素都需要进行测试 界面测试&#xff08;简称U测试&#xff09;&#xff0c;指按照界面的需求&#xff08;一般是U设计稿&#xff09;和界面的设计规则&#xff0c;对我们软件界面所展示的全部内容进行测试…

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种网络通信协议&#xff0c;它属于传输层的协议。是一…

火语言RPA流程组件介绍--鼠标拖拽元素

&#x1f6a9;【组件功能】&#xff1a;在开始位置上按下鼠标&#xff0c;拖动到结束坐标或指定元素上放下鼠标&#xff0c;实现目标元素的拖拽 配置预览 配置说明 丨拖动元素 支持T或# 默认FLOW输入项 开始拖动的元素,并从当前元素开始按下鼠标 丨拖动到 目标元素/目标位…

vue3 el-message组件封装

背景 在封装请求拦截器时,使用ElMessage进行弹窗提示成功或失败,但是如果页面用到多个接口,这时就会导致页面出现很多弹窗,导致用户体验不好,有可能出现卡顿现象。 这时就需要进行一些判断,如果前面的ElMessage还没关闭并且类型是一致的就return,不再弹窗提示,类型不…

项目日志——日志器模块一部缓冲区的设计、实现、测试

文章目录 异步缓冲区模块模块设计缓冲区设计单个缓冲区 实现测试 异步缓冲区模块 模块设计 异步日志器的思想是为了避免业务线程因为写日志的过程时间较长而长时间阻塞 异步日志器的工作就是把业务输出的日志内容放入内存缓冲区中&#xff0c;使用专门的线程进行日志写入 这…

一款高效、简洁的帧动画生成工具

在现代网页设计和移动应用开发中&#xff0c;帧动画是一种常见的动画实现方式&#xff0c;它通过连续显示一系列静态图片来模拟动画效果。然而&#xff0c;手动创建和管理这些帧动画图片不仅耗时费力&#xff0c;而且效率低下。为此&#xff0c;gka 应运而生&#xff0c;它是一…