一、环境说明

  1. 本文是 LeetCode 19题 : 删除链表的倒数第 N 个结点,使用c语言实现
  2. 使用双指针方法,算法性能较好。
  3. 测试环境:Visual Studio 2019

二、代码展示

快慢指针

C++

class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummy = new ListNode(-1);dummy->next = head;auto r = dummy;for(int i = 0;i<n+1;i++) r = r->next;auto l = dummy;while(r){l=l->next;r=r->next;}l->next = l->next->next;return dummy->next;}
};

C语言

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){struct ListNode *right =head,*left = head,* temp =NULL;//left是删除结点的前一个结点,right比left领先n+1步,temp是待删除结点for(int i = 0;i<n+1;i++){//让right领先n+1步if(NULL==right){//要删除的是头结点left = left->next;//删除操作head->next = NULL;free(head);//释放头结点return left;}right = right->next;}while(right){//right没有走到最右right = right->next;//right和left一起往后走left = left->next;}temp = left->next;//待删除结点left->next = temp->next;//删除操作temp->next = NULL;free(temp);//释放结点return head;
}

朴素做法

C++

class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummy = new ListNode(-1);dummy->next = head;int m = 0;//包含哑结点的链表长度for(auto t = dummy;t;t=t->next) m++;auto t = dummy;for(int i = 0;i<m-n-1;i++) t = t->next;t ->next = t->next->next;return dummy->next;}
};

三、思路分析

  • 使用快慢指针,先让 r i g h t right right 比 l e f t left left 领先 n + 1 n+1 n+1 步,然后 r i g h t right right 和 l e f t left left 一起向右遍历,等 r i g h t right right 走到最后, l e f t − > n e x t left->next left−>next 刚好是倒数第 N N N 个结点。
  • 提示,头结点的删除有所不同,删除头结点时, r i g h t right right 走了 n n n 步就已经为 N U L L NULL NULL 了,此时不应该继续遍历,而是让 l e f t = l e f t − > n e x t left=left->next left=left−>next ,并且返回 h e a d head head 。
  • 2022 / 11 / 19 2022/11/19 2022/11/19 更新 C + + C++ C++ 做法,使用哑结点,无需特判头结点 。

四、代码分析

  • temp是待删除结点,仅仅为了做题,可以不用temp,但是实际工作中,需要养成释放temp的习惯,避免内存泄漏。(C的做法释放了内存,C++没释放内存)

五、AC


六、复杂度分析

  1. 时间复杂度: O ( m ) O(m) O(m) , m m m 是链表长度, 遍历链表的时间复杂度 O ( m ) O(m) O(m) 。
  2. 空间复杂度: O ( 1 ) O(1) O(1) , 除若干变量使用的常量级空间,没有使用额外的线性空间。

(力扣)LeetCode19. 删除链表的倒数第 N 个结点(C++/C语言)相关推荐

  1. 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)

    19. 删除链表的倒数第 N 个结点(java) 一.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 输入:head = [1,2,3 ...

  2. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

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

    一:题目 二:上码 class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode*cur1 = ...

  4. 【力扣-JZ22】链表中倒数第k个结点

  5. 《LeetCode力扣练习》第19题 删除链表的倒数第 N 个结点 Java

    <LeetCode力扣练习>第19题 删除链表的倒数第 N 个结点 Java 一.资源 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:hea ...

  6. 【力扣(LeetCode)】【C/C++】【19.删除链表的倒数第 N 个结点】

    学习时间: 2023年1月30日 题目描述: 题解分享: // 作 者 : 繁 华 倾 夏 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h&g ...

  7. 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ

    LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...

  8. 【链表】leetcode19.删除链表的倒数第N个节点(C/C++/Java/Js)

    leetcode19.删除链表的倒数第N个节点 1 题目 2 思路 3 代码 3.1 C++版本 3.2 C版本 3.3 Java版本 3.4 JavaScript版本 4 总结 1 题目 题源链接 ...

  9. LeetCode-链表-19. 删除链表的倒数第 N 个结点

    描述: 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:head = [1,2,3,4, ...

最新文章

  1. 卷积神经网络CNN入门【pytorch学习】
  2. 使用Spring Boot构建RESTFul服务
  3. 图片跟随鼠标移动并放大js特效
  4. 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
  5. Wcf Rest Service模板--方法输入输出流数据
  6. 解决Ubuntu16.04中文乱码问题
  7. 手机语音混响软件_手机混响软件 如何把微信里的语音转发出去 有什么好用的变声软件 安卓微信语音转发插件...
  8. MacBook安装虚拟机VMware Fusion
  9. 新手播音小白,想学播音从什么地方开始?
  10. 弹出菜单 PopupMenu 的使用
  11. 疯癫的我到了巅峰 -- 我的成人礼
  12. 爬虫取中间文本_【实战No.2】1小时打造你自己的网络爬虫
  13. linux设置软件的路径,linux下查看和设置软件的安装路径
  14. Java CompletableFuture.runAfterEither任何一个完成就执行Runnable
  15. 怎样找回u盘里误删的文件
  16. 串口编程之一: WIN32 API 中串口DCB 结构的介绍
  17. python中frame用法_python:pandas中dataframe的基本用法汇总
  18. 分支与循环语句(下)
  19. 兔将十年大作《赤狐书生》特效解析:青蛙精篇
  20. 鼠标悬浮在button按钮上时的事件

热门文章

  1. 基于简单模型KNN——泰坦尼克号获救分析
  2. JavaFX 边框背景
  3. [R语言]手把手教你如何绘图(万字)
  4. Win11系统启动文件夹是空的怎么解决?
  5. [MongoDB] 按时间分组统计(任意时间段)
  6. oracle 整理磁盘碎片
  7. 【虚幻引擎】实现类LOL缓慢扣血血条
  8. zbursh2021尝新,安装包
  9. TensorFlow Lite(实战系列一):TFLite Android 迁移训练构建自己的图像识别APP
  10. 目标检测经典论文——Faster R-CNN论文翻译:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Net