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

C语言——删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第n个节点,返回链表的头节点head。 阅读详情
方法一:两次遍历算法

思路

我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L - n + 1)个结点,其中 L是列表的长度。只要我们找到列表的长度 L,这个问题就很容易解决。

算法

首先我们将添加一个哑结点作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。在第一次遍历中,我们找出列表的长度 L。然后设置一个指向哑结点的指针,并移动它遍历列表,直至它到达第 (L - n)个结点那里。我们把第 (L - n)个结点的 next 指针重新链接至第 (L - n + 2)个结点,完成这个算法。

public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    int length  = 0;
    ListNode first = head;
    while (first != null) {
        length++;
        first = first.next;
    }
    length -= n;
    first = dummy;
    while (length > 0) {
        length--;
        first = first.next;
    }
    first.next = first.next.next;
    return dummy.next;
}

复杂度分析

时间复杂度:O(L),该算法对列表进行了两次遍历,首先计算了列表的长度 LL 其次找到第 (L - n)个结点。 操作执行了 2L−n 步,时间复杂度为O(L)。

空间复杂度:O(1)O(1),我们只用了常量级的额外空间。
方法二:一次遍历算法
算法

上述算法可以优化为只使用一次遍历。我们可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 n 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 n个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。

public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode first = dummy;
    ListNode second = dummy;
    // Advances first pointer so that the gap between first and second is n nodes apart
    for (int i = 1; i <= n + 1; i++) {
        first = first.next;
    }
    // Move first to the end, maintaining the gap
    while (first != null) {
        first = first.next;
        second = second.next;
    }
    second.next = second.next.next;
    return dummy.next;
}

复杂度分析
时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次遍历。因此时间复杂度为 O(L)。

空间复杂度:O(1),我们只用了常量级的额外空间。
刷题记录的代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
      
        ListNode p =head;
        List<Integer> list = new ArrayList<>();
        while(p!=null){
            list.add(p.val);
            p=p.next;
        }
        
        list.remove(list.size()-n);
        
        if(list.isEmpty()){
            return null;
        }

        ListNode m = null;
        ListNode Nhead = new ListNode(list.get(0));
         m=Nhead;
        for(int i = 1 ;i<list.size();i++){
            ListNode listNode = new ListNode(list.get(i));
            m.next=listNode;
            m=listNode;
        }
        return Nhead;
    }
}

 

【面试题】删除链表中倒数第n个节点 问题描述给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。样例 给出链表1->2->3->4->5->null和 n = 2.删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.解题思路定义两个指针,刚开始分别指向头结点,然后先让一个指针先走n-1步,接着两个指针同时遍历链表,当第一个指针到达链表尾部的时候,第二个指针指向的就是要删除的倒数第n个结点。 编程需要注意的 阅读详情

相关推荐

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3732

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

问题描述: 给定一个链表,删除链表的顺数及倒数第 n 个节点。 示例1: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了顺数第2个及倒数第2个节点后,链表变为 1->3->5. 示例2: 给定一个链表: 1->2->3->4->5, 和 n = 3. 当删除了顺数第3个及倒数第3个节点后,链表变为 1->2->4->5. 说明: 给定的 n 保证是有效的。 #include<iostream>

wangyuwe的博客 671

WorkBench3.2 + VxWorks6.8安装教程

按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎...

Alive的博客 3万+

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

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1-&gt;2-&gt;3-&gt;4-&gt;5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1-&gt;2-&gt;3-&gt;5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? /** * Definition for singly-li...

程序员养成日记 474

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1702

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 457

leetcode *19. 删除链表的倒数第N个节点(2020.10.18)

【题目】*19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 【解题思路1】快慢指针 class Solution { public ListNode removeNthFromEnd(ListNode

Sophia_fez的博客 444

基于STM32的智能台灯PWM调光与人体感应融合设计

本文详细介绍了基于STM32单片机的智能台灯设计方案,重点讲解了PWM调光技术与人体感应模块的融合实现。通过STM32的高级定时器产生精准PWM信号控制LED亮度,结合红外传感器实现人来灯亮、人走灯灭的智能体验,同时集成光敏传感实现环境自适应调光,打造高效节能的智能照明解决方案。

threejs5artist的博客 823

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

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 示例 :解题思路: 方法一:先统计节点总数count,然后算出倒数第n个数为正数count - n + 1,最后正向迭代删除指定位置的节点。 注意:1、正向计数为不是count - n + 1 ,不要误用count - n来移动。 2、删除节点,要找的是该节点的前一个节点。如果创建了dummyNode虚节点(建议使用),那么移动了count - n + 1恰好dummy就是删除节点的前一个节点,只需

weixin_47365232的博客 6031

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 885

092、Python在芯片验证中的应用:从脚本小子到验证架构师

Python在芯片验证中的高效应用 本文通过实际案例展示了Python在芯片验证中的关键作用。凌晨三点的调试场景揭示了传统方法的局限,Python脚本能在20分钟内分析80GB波形数据定位FIFO指针问题。文章重点介绍了两个核心工具: 智能日志分析系统:通过正则表达式和上下文分析,自动分类百万行验证日志中的错误,生成可视化报告,效率远超传统grep方法。 寄存器模型生成器:将Excel表格自动转换为UVM寄存器模型代码,将原本需要两周的手工工作缩短至两小时,同时保证零错误。 文章还展示了Python与Sys

z534437748的博客 72

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

题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 牛客网详解 方法一:两次遍历 思路 将删除倒数的节点转换思路,变为删除从列表开始的节点,即将(L-n+1)的节点删除。L是表长,n已知,因此只要知道L表长,那么问题就可以解决 算法 设定一个哑结

baiye 468

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

Unknown给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。:你能尝试使用一趟扫描实现吗?

weixin_52739099的博客 1275

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeetCode 从链表中删除倒数第N个节点

从单链表中删除倒数第N个节点,要求之遍历一遍lia

dddongdong的专栏 3692

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

难度:两星 如何删除单链表得倒数第N个节点?这里依然利用快慢指针的办法,让slow指针指向第一个节点,让fast指针和slow间隔N个节点,即指向第N个节点。然后同时移动slow和fast,每次前进一步,直到fast指针到最后一个指针,此时slow指针就是倒数第N个节点,是不是觉得很巧妙?这里找到了第N个节点之后需要删除掉这个节点,那么因为是单链表,我们必须保留被删除节点之前的这个节点,以及被删...

682

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

引入虚拟头节点后,删除头节点和其他节点的操作可以统一处理,因为头节点也会有一个前节点(即虚拟头节点)。找到节点后,将节点的前一个节点的 next 指向节点的下一个节点;将节点的下一个节点的 prev 指向节点的前一个节点,这样就将节点从链表中删除了。为了方便删除节点,我们需要一个虚拟节点,让虚拟节点的 next 指向 head,这样就能保证删除节点的前一个节点不为空。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。第一步,遍历链表,找出链表的长度,确定要删除的节点的位置。

qq_64948664的博客 938

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

原题: 删除链表倒数第N个节点 第一种解法: 本文适用于初学者。它介绍了以下内容:链表的遍历和删除其末尾的第 n 个元素。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val ...

小诚信驿站 570

删除单向链表倒数第n个节点

// 删除倒数第n个节点 public void del(int n, ListNode node) { int length = 0; // 记录链表长度 ListNode head = node; // 保存头节点 while (node != null) { length++; node = node.next; // 移动指针 } ListNode resNode; // 从前往后找 int left = len

for62的博客 711

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

删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 解: class Solution { public:...

陈乐乐的博客 1060

删除链表中的倒数第n个节点

题目描述 给定一个链表,删除链表中倒数第n个节点,返回删除后的链表。 例子: 给定链表 1 -&amp;gt; 2 -&amp;gt; 3 -&amp;gt; 4 -&amp;gt; 5; n = 2; 返回结果 1 -&amp;gt; 2 -&amp;gt; 3 -&amp;gt; 5; 题目分析 入参,链表头节点head, 要删除的节点number 思路分析 如果未说明入参一定合法,按照防御式编程的思想,需要对参数进行校验。 单向链表,并且

u014570945的博客 165

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

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 最先想到的做法一定是先找出链表的长度,然后正向找到倒数第N个节点。这样思路简单,但是...

weixin_45398265的博客 470

删除链表的倒数第n的节点

题目描述 给定一个链表,删除链表的倒数第n个节点,并且返回链表的头节点。 示例: 给定一个链表: 1->2->3->4->5, 和n= 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的n保证是有效的。 测试数据 class Node(): '''定义一个链表类''' de...

weixin_41076200的博客 145
上一篇: 相交链表
下一篇: 环形链表1&环形链表2--双指针法的应用
ITgo
博客等级 码龄9年 14粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值