LeetCode 19:删除链表的倒数第N个节点 Remove Nth Node From End of List

简介: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。Given a linked list, remove the n-th node from the end of list and return its head.示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 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, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

Note:

Given n will always be valid.

进阶:

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

Follow up:

Could you do this in one pass?

解题思路:

这道题很有意思,虽然很简单,但是很考验一个人的思维。最先想到的方法就是遍历整个链表得到长度,减去 n 得到实际应该删除的节点的位置了。然而由于单链表删除操作的特殊性,得到位置之后仍然需要再遍历一次来删除该节点。

进阶要求是一次遍历完成该题,想想是否有好的方法?

假设链表长度为 L ,定义一个指针先走 n 步,此时该指针还剩下 L-n 个节点即可完成该链表的遍历。而第 L-n 个节点不就是题目要求的的要删除的倒数第 n 个节点吗?这时候只需要再定义一个指针,让它与之前的指针同时遍历,当第一个指针遇到空节点时(null 节点),该指针即指向删除的节点。

值得注意的的是,指向应当删除的节点并无法删除它,应当指向该删除节点的前一个节点。

Java:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode curA = head;
        ListNode curB = head;
        for (int i = 0; i < n; i++) curA = curA.next;
        if (curA == null) {//如果走了n步之后该节点指向空节点,则该链表只有一个节点
            head = head.next;
            return head;
        }
        while (curA.next != null) {//当第一个指针的下一个节点为空时,该指针指向最后一个节点,而指针curB 走了L-n-1步,即指向该删除节点的前一个节点
            curA = curA.next;
            curB = curB.next;
        }
        curB.next = curB.next.next;//将本来指向应当删除节点地址指向应当删除节点的下一个节点的地址
        return head;
    }
}

Python3:

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        curA,curB=head,head
        for i in range(n):
            curA=curA.next
        if not curA:
            head=head.next
            return head
        while(curA.next):
            curA=curA.next
            curB=curB.next
        curB.next=curB.next.next

欢迎关注公.众号一起刷题:爱写Bug

目录
相关文章
|
11月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
118 1
|
3月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
2月前
|
运维 Kubernetes API
解决Kubernetes集群中master节点无法与node节点通信的策略。
这些策略不仅需要执行命令来获取信息,更要深入理解集群组件如何交互,以便进行准确的故障定位与修复。一条一条地排查,并适时回顾配置文件,证书有效性等,通常可以找到问题所在。给出的命令需要根据具体环境的配置进行适当的修改。故障排除往往是一个细致且需求反复验证的过程,但遵循上述策略可以高效定位大部分通信故障的原因。
221 12
|
2月前
|
Kubernetes 网络协议 API
在k8s集群中解决master节点与node通信问题
整个排查和解决流程需要综合应用以上方法,以及根据具体情况调整排查顺序或应用其他技术细节。为保证解决方案的实用性和有效性,还需紧跟Kubernetes社区的最新动态和最佳实践。在实际操作过程中,应记录所采取的步骤和观察到的系统响应,以便在遇到类似问题时能够快速定位和解决。
262 8
|
3月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
119 1
|
5月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
174 10
|
6月前
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
411 17
|
11月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
123 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表