背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:链表

链表(Linked List) 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里除了存放本身数据(data fields)之外还存放其后继节点的指针(Pointer)。

使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

链表有很多种不同的类型:单向链表,双向链表以及循环链表。


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

示例

给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明

给定的n保证是有效的。

进阶

你能尝试使用一趟扫描实现吗?


第一种:先求链表长度的方法

思路:先求出链表的长度len,再求出要删除结点的位置index = len - n。这样就可以从头结点开始遍历到该位置,删除该结点即可。

  • 执行结果:通过
  • 执行用时:148 ms, 在所有 C# 提交中击败了 6.77% 的用户
  • 内存消耗:24.6 MB, 在所有 C# 提交中击败了 5.43% 的用户
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) { val = x; }* }*/public class Solution
{public ListNode RemoveNthFormEnd(ListNode head, int n){int len = GetLength(head);int index = len - n;if (index == 0){head = head.next;return head;}ListNode temp = head;for (int i = 0; i < index - 1; i++){temp = temp.next;}temp.next = temp.next.next;return head;}public int GetLength(ListNode head){ListNode temp = head;int i = 0;while (temp != null){i++;temp = temp.next;}return i;}
}

第二种:双指针法

思路:使用两个指针,前面的指针p2先走n步,接着让后面的指针p1p2同步走,p2走到终点,p1即走到要移除的结点位置。

  • 执行结果:通过
  • 执行用时:108 ms, 在所有 C# 提交中击败了 74.84% 的用户
  • 内存消耗:24.8 MB, 在所有 C# 提交中击败了 5.43% 的用户
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) { val = x; }* }*/
public class Solution {public ListNode RemoveNthFromEnd(ListNode head, int n) {ListNode p1 = head;ListNode p2 = head;while (n > 0){p2 = p2.next;n--;}if (p2 == null) //移除头结点{return head.next;}while (p2.next != null){p2 = p2.next;p1 = p1.next;}p1.next = p1.next.next;return head;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:48 ms, 在所有 Python3 提交中击败了 23.58% 的用户
  • 内存消耗:13.5 MB, 在所有 Python3 提交中击败了 7.83% 的用户
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:p1 = headp2 = headwhile(n>0):p2 = p2.nextn-=1if(p2 is None): #移除头结点return head.nextwhile(p2.next):p1 = p1.nextp2 = p2.nextp1.next = p1.next.nextreturn head

来源

  • https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

刻意练习:LeetCode实战 -- Task11. 删除链表的倒数第N个节点相关推荐

  1. leetcode算法题--删除链表的倒数第N个节点

    原题链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 双指针法 ListNode* removeNthFrom ...

  2. LeetCode实战:删除链表中的节点

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...

  3. [链表|多解法] leetcode 19 删除链表的倒数第N个节点

    [链表|多解法] leetcode 19 删除链表的倒数第N个节点 1.题目 题目链接 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2-&g ...

  4. Leetcode算法Java全解答--19. 删除链表的倒数第N个节点

    Leetcode算法Java全解答–19. 删除链表的倒数第N个节点 文章目录 Leetcode算法Java全解答--19. 删除链表的倒数第N个节点 题目 想法 结果 总结 代码 我的答案 大佬们的 ...

  5. 【亡羊补牢】挑战数据结构与算法 第59期 LeetCode 19. 删除链表的倒数第N个节点(链表)

    仰望星空的人,不应该被嘲笑 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. ...

  6. LeetCode第19题;删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删 ...

  7. leetcode 19. 删除链表的倒数第N个节点(双指针)

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  8. leetcode —— 19. 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  9. 领扣(LeetCode)删除链表的倒数第N个节点 个人题解

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1 ...

最新文章

  1. django框架之自定义重定向页面
  2. 现代前端开发路线图:从零开始,一步步成为前端工程师
  3. Ubuntu16.04 配置SSH无密码登录
  4. SAP 电商云 Spartacus UI 设置 Delivery Mode 的时序分析和一个竞争条件问题分享
  5. Android学习第十三天----ScrollView
  6. 前端每日实战:163# 视频演示如何用原生 JS 创作一个多选一场景的交互游戏(内含 3 个视频)...
  7. js或css指定元素点击时内容不可被选中
  8. java折半查找(递归版)
  9. 【数据库原理及应用教程(第4版|微课版)陈志泊】【第六章习题】
  10. Web性能优化:雅虎35条
  11. 【软考】专栏导读(软考全面介绍、资格报考建议)
  12. CC呼叫中心系统源码注册机cccloud
  13. 锐浪报表数据源access_C# 锐浪报表 示例源码
  14. Minecraft安装资源包
  15. WEB-INF与META-INF详解
  16. k8s集群灾难恢复-原机器能起来
  17. Navicat 连接数据库报错:1045-Access denied for user ‘root‘@‘localhos
  18. Vodafone 移动终端声质量评价
  19. 优购小程序项目效果预览
  20. 微信小程序开发工具安装破解

热门文章

  1. 线程组多次调用_详细分析 Java 中启动线程的正确和错误方式
  2. (C++)对用户输入的整形数组进行冒泡排序
  3. 白盒测试各种“覆盖”间的拓扑关系及白盒用例常用要求
  4. Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理
  5. 开发板tftp:timeout问题
  6. Build Boost C++ libraries for x32/x64 VC++ compilers on Windows
  7. 一个系统的html源代码,h5后台模板源码bootstrap网站后台管理系统HTML页面后台源代码...
  8. 离散数学中的联结符号
  9. 2018-3-20论文(一种新的群体智能算法--狼群算法)笔记一(引言中提到的的一些智能算法,以及自己的感想)
  10. css小技巧 -- 单标签实现单行文字居中,多行文字居左