[每日算法 - 阿里机试] leetcode19. 删除链表的倒数第 N 个结点 「 详细图释一看就懂!」
入口
题目描述
给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]示例 2:
输入:head = [1], n = 1
输出:[]示例 3:
输入:head = [1,2], n = 1
输出:[1]提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
方法一:栈
- 链表顺序入栈
- 将链表后n个节点出栈
- 获取需要删除的第n个元素,变更next
- 返回虚拟节点dummy.next即可
图示
图示,n=2
Java实例
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 定义虚拟节点
ListNode dummy = new ListNode(0, head);
Deque<ListNode> stack = new LinkedList<ListNode>();
// 防止需要删除节点为头节点时的空指针异常,将虚拟节点推入栈中
stack.push(dummy);
// 将链表中的每个节点推入栈中
while (head != null) {
stack.push(head);
head = head.next;
}
// 弹出栈中的前n个节点,使栈顶元素为倒数第n个节点的前一个节点
for (int i = 0; i < n; i++) {
stack.pop();
}
// 获取倒数第n个节点的前一个节点
ListNode pre = stack.peek();
// 将前一个节点的next指针跳过倒数第n个节点,直接指向倒数第n个节点的下一个节点
pre.next = pre.next.next;
// 返回虚拟节点的下一个节点作为新链表的头节点
return dummy.next;
}
}
复杂度分析
时间复杂度:O(L), L 是链表的长度。
空间复杂度:O(L), L 是链表的长度,主要为栈的开销。
方法二:双指针
使用快慢指针的方式,快指针与慢指针相差n-1,即快指针比慢指针超前了 n 个节点。 两个指针同时遍历链表,当快指针指向null时,此时慢指针正好指向倒数第n个元素的前一个元素。
图示,n=2
Java示例
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 定义虚拟节点
ListNode dummy = new ListNode(0, head);
ListNode first = head;
ListNode second = dummy;
// 将第一个指针向前移动 n 步
for (int i = 0; i < n; i++) {
first = first.next;
}
// 同时移动第一个和第二个指针,直到第一个指针为空
while (first != null) {
first = first.next;
second = second.next;
}
// 此时第一个指针到达链表尾,second 正好指向倒数第 n 个元素的前一个节点
// 将前一个节点的 next 指针跳过倒数第 n 个节点,直接指向倒数第 n 个节点的下一个节点
second.next = second.next.next;
// 返回虚拟节点的下一个节点作为新链表的头节点
return dummy.next;
}
}
复杂度分析
时间复杂度:O(L),L 是链表的长度。
空间复杂度:O(1)。
[每日算法 - 阿里机试] leetcode19. 删除链表的倒数第 N 个结点 「 详细图释一看就懂!」的更多相关文章
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- 打败算法 —— 删除链表的倒数第n个结点
本文参考 出自LeetCode上的题库 -- 删除链表的倒数第n个结点,官方的双指针解法没有完全符合"只遍历一遍链表"的要求,本文给出另一种双指针解法 https://leetco ...
- 四种语言刷算法之删除链表的倒数第 N 个结点
力扣19. 删除链表的倒数第 N 个结点 1.C /** * Definition for singly-linked list. * struct ListNode { * int v ...
- 动图:删除链表的倒数第 N 个结点
本文主要介绍一道面试中常考链表删除相关的题目,即 leetcode 19. 删除链表的倒数第 N 个结点.采用 双指针 + 动图 的方式进行剖析,供大家参考,希望对大家有所帮组. 19. 删除链表的倒 ...
- 19. 删除链表的倒数第 N 个结点
目录 19.删除链表的倒数第N个节点 题目 题解-暴力 题解-哈希表 题解-双指针 19.删除链表的倒数第N个节点 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 输入:he ...
- 【力扣】19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 示例 1: 输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 ...
- 【链表】【leetCode高频】: 19. 删除链表的倒数第 N 个结点
1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 2.算法分析 知识补充: . 分析: 题目要求是删除链表中倒数第N个结点.可以使用两个指针slow,fast. 重点是 ...
- [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- 【LeetCode】19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:链表, 删除节点,双指针,题解,leetcode, 力扣 ...
随机推荐
- 基于Netty,徒手撸IM(一):IM系统设计篇
本文收作者"大白菜"分享,有改动.注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷! 1.引言 这又是一篇基于Netty的IM编码实践文章,因为合成一篇内容太长,读起来 ...
- [开源项目]YOLOv8_Efficient
Yolov8_Efficient Simple and efficient use for yolov8 About This is an unofficial repository maintain ...
- Solution Set - “说选个晴日,露能滴出彩虹”
目录 0.「BZOJ #3457」Ring 1.「CF 1824C」LuoTianyi and XOR-Tree 2.「CF 1824D」LuoTianyi and the Function 3.「C ...
- runoob-设计模式
https://www.runoob.com/design-pattern/design-pattern-tutorial.html 设计模式(Design pattern)代表了最佳的实践,通常被有 ...
- Golang-基本语法2
http://c.biancheng.net/golang/syntax/ Go语言变量的声明(使用var关键字) Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变 ...
- R语言学习数据挖掘
1.用R计算数据基本统计量(均值) 学习机器学习和数据挖掘中的各种算法和模型,需要掌握统计学的基本概念.统计学是通过搜索.整理.分析数据等手段,以达到推断所测对象的本质,并预测对象未来走势的一门综合性 ...
- Nacos 从入门到精通-手把手教会你
Nacos 使用教程 Nacos 是阿里巴巴开源的动态服务发现.配置管理和服务管理平台,旨在帮助您更容易地构建.交付和管理微服务平台.它集成了服务注册与发现.动态配置管理.动态 DNS 服务和服务及元 ...
- Luogu P2414 NOI2011 阿狸的打字机 题解 [ 紫 ] [ AC 自动机 ] [ 离线思想 ] [ 树状数组 ] [ dfs 序 ]
阿狸的打字机:非常牛的 AC 自动机题. 暴力 先考虑在暴力的情况下,我们如何计算 \(x\) 匹配 \(y\) 的次数.显然,我们会模拟往 \(y\) 里加字符的过程,在此过程中做 KMP 进行匹配 ...
- mysql之数据连接池
数据库连接池 C3P0: 配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config&g ...
- Common.Logging+log4net搭建项目日志框架
原文参考链接:https://www.cnblogs.com/heys/p/5787123.html Common.Logging+(log4net/NLog/) common logging是一 ...