Leetcode算法——19、删除倒数第n个节点

图解:删除链表倒数第N个节点 前言 在上篇中,小莱给大家分享了链表的相关知识及初步进阶。接下来几期里,小莱计划将链表的相关拓展写成一个系列。 画外音:关于链表相关知识,请点击回顾 今天,我们先来看第一道拓展题。 题目: 给定一个链表,删除链表倒数第n个节点,并且返回链表的头结点。 示例: 给定一个链表:1->2->3->4->5,和 n = 2。当删除了倒数第二个节点后,链表变为 1->2->3->5。 说明: 给定的n保证是有效的。 链表长度法 相信很多人看到这道题时的第 阅读详情

题目

给定一个链表,删除倒数第n个节点,返回头部。

假设n总是有效的。

Given a linked list, remove the n-th node from the end of list and return its head.

示例:

输入: 1->2->3->4->5, and n = 2.
输出:1->2->3->5.

思路

1、暴力法

首先遍历一遍,得到链表的总长度,然后就知道了倒数第n个节点是正数第几个节点了。

然后再遍历一遍,删除这个节点,返回头部即可。

但是这样做的话需要遍历两遍。

2、双指针法

从头部开始遍历所有节点,指针为p,同时维护第二个指针p2,使得p2总是落后p指针n个节点。

这样,当p到达末尾时,p2恰好到达倒数第n个节点,可以直接删除。

这个方法只需要遍历一遍。

python实现

class ListNode:
    def __init__(self, x):
        if isinstance(x, list):
            self.val = x[0]
            self.next = None
            head = self
            for i in range(1, len(x)):
                head.next = ListNode(x[i])
                head = head.next
        else:
            self.val = x
            self.next = None
    def output(self):
        '''
        输出链表
        '''
        result = str(self.val)
        head = self.next
        while(head is not None):
            result += f' -> {head.val}'
            head = head.next
        return '(' + result + ')'

def removeNthFromEnd(head, n):
    """
    :type head: ListNode
    :type n: int
    :rtype: ListNode
    双指针法。
    """
    if not head or n == 0:
        return head
    
    p = head
    p2 = None
    count = 0
    while(p.next):
        p = p.next
        if p2:
            p2 = p2.next
        else:
            count += 1
            if count == n:
                p2 = head
    
    # 此时,p指向最后一个节点,p2指向倒数第 n+1 个节点
    if p2: # p2被赋值
        p2.next = p2.next.next
    else: # p2为空,说明还没有给p2赋值,要删除的节点为head节点
        head = head.next
    return head

if '__main__' == __name__:
    l = ListNode([1,2,3,4,5])
    n = 4
    print(removeNthFromEnd(l, n).output())
python【力扣LeetCode算法题库】19-删除链表的倒数第N个节点 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? # Definition for singly-lin... 阅读详情

相关推荐

OpenCode:开源代码智能代理平台的全面解析

OpenCode是一个开源代码智能代理平台,采用模块化微服务架构,支持多种AI模型集成。该系统包含前端交互层、代理服务层和模型集成层,提供Build、Plan和General三种代理模式,分别负责代码编写、分析和复杂任务处理。OpenCode支持跨平台安装,具备权限验证、上下文感知等安全机制,并集成LSP协议实现深度代码理解。相比竞品,其开源特性、终端优先设计和提供商无关架构具有明显优势,适用于个人开发、团队协作等多种场景,为开发者提供强大的AI辅助编程能力。

Aaron_945的博客 1424

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

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

weixin_44284498的博客 1330

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 319

求链表中倒数的 第 n 个结点

查找链表中倒数的第 n 个结点

m0_67186846的博客 648

SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程

本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。

weixin_28705087的博客 427

探索Python融合地学:一文解决osgeo库安装失败问题

总结一下,要安装osgeo模块,关键在GDAL依赖库的安装,如果能够顺利安装GDAL依赖库,因其是osego的模块,因此osgeo的部分模块也能够得到自动安装,此时再运行代码,发现代码并不报错,能够正常运行了。第一步,我们要安装imagecodecs库,它支持多种常见的图像格式,当然也包含我们的目标tif格式,为方便后续的图像处理和安装osgeo模块,先安装此库。目前GDAL已经更新到了3.10版本,这里主要看你的Python版本是上面,小编用的是Python3.13,电脑是64位的,因此,我们选择。

Promising_GEO的博客 5461

删除链表的倒数第N个节点

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?思路是这样的,但要注意一些细节。输出:[1,2,3,5]

lw的博客 1479

零、HarmonyOS应用开发者基础学习总览

零、HarmonyOS应用开发者基础学习总览

weixin_45029825的博客 1454

查找链表倒数第n个节点

题目:查找单链表中倒数第n个节点数据 思路: 考虑到时间复杂度,不允许对链表进行两次遍历操作来完成上述需求。该问题可通过定义两个快慢指针,快指针p1和慢指针p2,倒数第n个,p1最开始指向头节点,向后移动n-1个节点,到达如图a所示的地方,p2指针最开始指向头结点p2,如图b所示,p1和p2同时向后移动,当p1到达链表尾部时,停止,此时p2指向的节点即为倒数第n个节点。 代码: /** *查找倒数第n个节点 *@paramlinkedNodeOne *@parami...

kaibingwang的博客 1142

跟着团子学SAP CO:基于成本的完工百分比结算:Cost-based POC(以项目为例)

本文以英国及北美会计准则下的基于成本的POC的销售型项目结算对PS模块中的完工百分比进行介绍

Lucas1211的博客 2万+

uniapp - 超详细的 H5 公众号网页微信登录示例代码,提供从 0-1 公众号配置及详细注释代码(站在新手小白的角度)第三方微信授权登录的实现!!

uniapp微信浏览器H5授权微信登录,UniApp开发H5接入微信登录的全过程,uniapp的H5页面使用微信登录,uniapp H5微信授权登录,H5之微信授权登陆 (uniapp网页版微信授权登录),uni-app开发H5第三方微信授权登录的实现,uniapp如何实现微信授权登录,公众号H5页面接入微信登录流程,uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级

✅ 精选推荐文章 1万+

【力扣算法】19-删除链表的倒数第N个节点

题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 题解 摘要 本文适用于初学者。它介绍了以下内容: 链表的遍历和删除其末尾的...

ZeromaXHe的博客 1264

地图自定义编码CSV转换成ini文件

创 建 schema.ini 文件:有时,当您尝试使用 .csv 文件将自定义地理信息导入 Tableau 时,您可能会看到“无法使用.csv,因为它不包含唯一列”错误消息。这是因为您的 .csv 文件可能包含数值数据,例如数值邮政编码。对于新的地理角色,Tableau 将只接受文本字段。但是,您可以创建一个 schema.ini 文件,以指示 Tableau 应将您要导入的数值字段视为文本字段。...

wenyusuran的专栏 1975

算法精讲-leetcode19-删除链表的倒数第N个节点

删除链表的倒数第N个节点题目描述解题思路代码示例运行结果 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 解题思路 代码示例 public class Test { public stat...

weixin_43954926的博客 900

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode 算法19.删除链表的倒数第N个节点

问题 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 示例 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 自解 思路 先进行一趟扫描将链表倒置,再进行第二趟扫描将指定节点删除。 代码...

zyqer1997的博客 165

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 算法题库【19】——删除链表的倒数第N个节点

删除链表的倒数第N个节点 题目描述: 解题思路: 第一种:这个方法用到了双指针,方法也很简单,我们通过for循环和a = a.next使得a链表往后走n个位置,这样的话a和b就相隔n个位置。这里如果a已经走完了,说明这个链表倒数n个位置就是这个链表的表头,那么则直接返回head。如果a没有走完,那么很明显这里因为a和b隔着n个位置,那么等到a到达了链表的尾部,则b就是处于距离链表尾部n个位置的...

Jupiker的博客 216

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

算法修炼之路——【链表】Leetcode19 删除链表倒数第n个节点

文章目录问题描述问题分析步骤罗列解题代码复杂度分析GitHub代码 问题描述 给定一个链表,删除链表的倒数第n个节点,并返回链表的头节点。 示例: 输入: head = [1, 2, 3, 4, 5], n = 2 输出: head = [1, 2, 3, 5] 说明: 给定的n保证是有效的 问题分析 这个题目难度为“简单”,但是需要注意与Leetcode203的区别,这里是直接给了链表中的某...

技术更新每天 195

算法day4 链表(Leetcode24. 两两交换链表中的节点,Leetcode19.删除链表的倒数第N个节点,Leetcode160.链表相交,Leetcode142.环形链表II)

思路:使用虚拟头节点,利用双指针表示,如图: 代码: 时间复杂度:O(n) 空间复杂度:O(1) Leetcode19.删除链表的倒数第N个节点 思路:双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。代码: 时间复杂度: O(n) 空间复杂度: O(1) Leetcode160.链表相交 思路:简单来说,就是求两个链表交点节点的指针。 (指针相等而不是值相等)为了方便

qq_53601004的博客 679

代码随想录算法训练营第四天|LeetCode24. 两两交换链表中的节点,LeetCode19. 删除链表的倒数第N个结点,LeetCode160. 相交链表,LeetCode142. 环形链表 II

思路:依旧创建一个虚拟头结点,方便之后进行操作,然后让cur指向当前的虚拟头结点,然后想明白循环的终止条件是cur->next=NULL(总节点数为偶数的情况)或者cur->next->next=NULL (总节点数为奇数的情况,最后剩一个节点不用交换),在循环内需要将cur->next和cur->next->next->next保存为临时变量,剩余操作就是交换了,以及在交换结束后cur需要向后移动两个位置。

Liverpool0519的博客 3127

LeetCode 19.删除链表中的倒数第N个节点 改进算法

之前的实现方法在这里。

qq_74727181的博客 542

[数据结构与算法]leetcode19删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list class Solution { public ListNode removeNthFrom

当年小白的博客 199

[算法][力扣19]删除链表的倒数第N个节点

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

wyj180的博客 37

代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、LeetCode19.删除链表的倒数第N个节点、LeetCode160.链表相交、LeetCode142.环形链表II

首先建立虚拟头节点,方便处理前两个节点的交换,注意cur 指针应该指向交换节点的前一个节点,所以下图中橙色矩形代表的是指针cur 应该指向的位置(不是节点,如果交换后依然是同样的位置,但不再是原节点)。交换的步骤:首先cur 指针遍历到交换节点的前一位,新建两个临时变量temp 和temp1 保存1 节点和 3 的节点(防止在cur.next = cur.next.next 后找不到1 节点)。

m0_49342683的博客 826

算法——删除链表的倒数第N个节点(leetcode19)

总结:快慢指针中的fastIndex向后移动n+1个单位后那么slowIndex与fastIndex之间的间隔节点数是固定的所以当fastIndex指向null的时候slowIndex所指向的位置也就是从fastIndex开始往后数第n+1个节点的位置也就是删除节点的前一个位置这样就可以巧妙的删除节点了。6、令cur指向需要删除节点的后一个节点即可也就是cur.next=cur.next.next。2、定义快慢指针fastIndex、slowIndex指向虚拟节点。要删除的链表正数第m个节点的前一个节点)

Lemon_man_的博客 1378

【LeetCode】打卡--Python3算法19. 删除链表的倒数第N个节点

【LeetCode】打卡–Python3算法19. 删除链表的倒数第N个节点 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶...

Asher117的博客 436
上一篇: Leetcode算法——18、四数之和
下一篇: Leetcode算法——20、判断有效括号
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值