力扣刷题-热题100题-第29题(c++、python)

news2025/4/13 23:09:01

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&envId=top-100-liked

计算链表长度

对于链表,难的就是不知道有多少元素,所以先遍历一次链表得到元素个数,然后根据要删除的位置可以在再一次遍历时找到删除的元素的前一个元素位置。需要注意的是若要求删除的是第一个元素,因为第一个元素前没有 元素,所以不好操作,因此我们手动设置一个头指针指向第一个元素。

//c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
        ListNode* h=new ListNode(0,head);
        ListNode* a=h;
        int m=0;
        while(head)
        {
            m=m+1;
            head=head->next;
        }
        for(int i=0;i<m-n;i++)  a=a->next;
        a->next=a->next->next;
        return h->next;
    }
};

#python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        m=0
        h=head
        while h:
            m=m+1
            h=h.next
        h=ListNode(0,head)
        a=h
        for i in range(m-n):
            a=a.next
        a.next=a.next.next
        return h.next

有一种数据结构是后进先出,代入这道题完美适应,所以遍历链表,使元素入栈,注意这里也要加入头指针指向第一个元素,然后根据倒数第几个元素要删除的去出栈,最后选取栈顶元素也就是要删除元素的前一个元素进行 操作。

//c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
        ListNode* h=new ListNode(0,head);
        ListNode* a=h;
        stack<ListNode*> m;
        while(a)
        {
            m.push(a);
            a=a->next;
        }
        for(int i=0;i<n;i++)  m.pop();
        ListNode* b=m.top();
        b->next=b->next->next;
        return h->next;
    }
};

#python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        h=ListNode(0,head)
        a=h
        m=list()
        while a:
            m.append(a)
            a=a.next
        for i in range(n):
            m.pop()
        b=m[-1]
        b.next=b.next.next
        return h.next

双指针

 最喜欢这个解法,巧妙,且只需遍历一次链表,虽然两次和一次也没差。。

要加头指针!

就是两个指针,并保证这两个指针中间间隔要求的倒数n个元素,然后在快的指针到达链表尾部时,慢的指针自然而然就在要删除元素的前一个元素的位置了。

//c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) 
    {
        ListNode* h=new ListNode(0,head);
        ListNode* a=h;
        ListNode* b=head;
        for(int i=0;i<n;i++)  b=b->next;
        while(b)
        {
            a=a->next;
            b=b->next;
        }
        a->next=a->next->next;
        return h->next;
    }
};

#python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        h=ListNode(0,head)
        a=h
        b=head
        for i in range(n):
            b=b.next
        while b:
            a=a.next
            b=b.next
        a.next=a.next.next
        return h.next

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

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

相关文章

阻止上传可执行程序

点击工具中的文件服务器资源管理器 、然后点击文件屏蔽管理中的文件屏蔽&#xff0c;然后导入目标文件选择要限制的属性即可

DirectX修复工具免费版下载安装教程(附安装包)

文章目录 前言一、DirectX修复工具免费版介绍二、DirectX修复工具免费版安装教程1. 下载安装包2. 解压文件3. 以管理员身份运行4. 开始检测与修复5. 查看修复详情 前言 本教程主要介绍的是DirectX修复工具免费版下载安装教程&#xff0c;帮您轻松解决 DirectX 相关问题。 一、…

UE5学习笔记 FPS游戏制作33 游戏保存

文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能&#xff0c;核心节点&#xff0c;类似于json操作&#xff0c;需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…

TypeScript vs. JavaScript:技术对比与核心差异解析

引言 在 Web 前端开发领域&#xff0c;JavaScript&#xff08;JS&#xff09;长期占据主导地位&#xff0c;但随着项目复杂度的提升&#xff0c;开发者逐渐面临维护性差、协作困难等问题。TypeScript&#xff08;TS&#xff09;作为 JavaScript 的超集&#xff0c;通过静态类型…

《C奥林匹斯宝典:基础篇 - 重载函数》

一、重载函数 &#xff08;一&#xff09;函数模板重载 详细解析&#xff1a;函数模板提供了一种通用的函数定义方式&#xff0c;可针对不同类型进行实例化。当存在函数模板与普通函数、其他函数模板同名时&#xff0c;就构成了函数模板重载。编译器在编译阶段&#xff0c;依…

【408--考研复习笔记】计算机网络----知识点速览

目录 一、计算机网络体系结构 1.计算机网络的定义与功能&#xff1a; 2.网络体系结构相关概念&#xff1a; 3.OSI 七层模型与 TCP/IP 模型&#xff1a; 4.通信方式与交换技术&#xff1a; 电路交换 报文交换 分组交换 5.端到端通信和点到点通信&#xff1a; 6.计算机…

TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享

导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据&#xff0c;让架构师更简单、高效地定位问题、分析问题、解决问题&#xff0c;已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数&#xff0c;帮助大家更好地观测系统的状…

15:00开始面试,15:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

蓝桥杯准备(前缀和差分)

import java.util.Scanner; public class qianzhuihe {public static void main(String[] args) {int N,M;Scanner scnew Scanner(System.in);Nsc.nextInt();Msc.nextInt();int []treesnew int[N1];//设为N1的意义&#xff0c;防止越界int []prefixSumnew int[N1];for(int i1;i…

Minimind 训练一个自己专属语言模型

发现了一个宝藏项目&#xff0c; 宣传是完全从0开始&#xff0c;仅用3块钱成本 2小时&#xff01;即可训练出仅为25.8M的超小语言模型MiniMind&#xff0c;最小版本体积是 GPT-3 的 17000&#xff0c;做到最普通的个人GPU也可快速训练 https://github.com/jingyaogong/minimi…

STM32八股【5】----- TIM定时器

1. TIM定时器分类 STM32 的定时器主要分为以下几类&#xff1a; 高级定时器&#xff08;Advanced TIM&#xff0c;TIM1/TIM8&#xff09; 具备 PWM 生成、死区控制、互补输出等高级功能&#xff0c;适用于电机控制和功率转换应用。通用定时器&#xff08;General-purpose TIM…

厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度&#xff0c;具体应用如下&#xff1a; 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌&#xff08;带宽超500MHz&#xff09;实现高时间分辨率&#xff0c;结合…

C++刷题(四):vector

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及刷题记录&#xff0c;使用语言为C。 每道题我会给出LeetCode上的题号&#xff08;如果有题号&#xff09;&#xff0c;题目&#xff0c;以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

【虚拟仪器技术】Labview虚拟仪器技术应用教程习题参考答案[13页]

目录 第1章 第2章 第3章 第4章 第&#xff15;章 第&#xff16;章 第&#xff17;章 第8章 第1章 1. 简述虚拟仪器概念。 参考答案&#xff1a;虚拟仪器是借助于强大的计算机软件和硬件环境的支持&#xff0c;建立虚拟的测试仪器面板&#xff0c;完成仪器的控制、数…

UE5学习笔记 FPS游戏制作34 触发器切换关卡

文章目录 搭建关卡制作触发器传送门显示加载界面 搭建关卡 首先搭建两个关卡&#xff0c;每个关卡里至少要有一个角色 制作触发器传送门 1 新建一个蓝图&#xff0c;父类为actor&#xff0c;命名为portal&#xff08;传送门&#xff09; 2 为portal添加一个staticMesh&#…

智谱大模型(ChatGLM3)PyCharm的调试指南

前言 最近在看一本《ChatGLM3大模型本地化部署、应用开发和微调》&#xff0c;本文就是讨论ChatGLM3在本地的初步布设。&#xff08;模型文件来自魔塔社区&#xff09; 1、建立Pycharm工程 采用的Python版本为3.11 2、安装对应的包 2.1、安装modelscope包 pip install model…

新专栏预告 《AI大模型应知应会短平快系列100篇》 - 整体规划设计

做个预告&#xff0c;为系统化梳理AI大模型的发展脉络&#xff0c;并为普及AI素养做一点贡献&#xff0c;特给自己制定了一个小目标&#xff0c;3个月内完成交稿。 AI大模型应知应会短平快系列100篇 - 整体规划设计 一、基础知识模块&#xff08;20篇&#xff09; 1.1 大模型…

SwanLab Slack通知插件:让AI训练状态同步更及时

在AI模型训练的过程中&#xff0c;开发者常常面临一个难题&#xff1a;如何及时跟踪训练状态&#xff1f;无论是实验超参数的调整、关键指标的变化&#xff0c;还是意外中断的告警&#xff0c;传统的监控方式往往依赖手动刷新日志或反复检查终端&#xff0c;这不仅效率低下&…

操作系统高频(六)linux内核

操作系统高频&#xff08;六&#xff09;linux内核 1.内核态&#xff0c;用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限&#xff1a;内核态拥有最高的权限&#xff0c;可以访问和执行所有的系统指令和资源&#xff0c;而用户态的权限相对较低&#x…