力扣题目 19:删除链表的倒数第N个节点 【python】

简介: 力扣题目 19:删除链表的倒数第N个节点 【python】

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区作者专栏每日更新:

image.png

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

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

示例

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

说明

给定的 n 保证是有效的。

进阶

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

解题思路

解决这个问题的关键是找到倒数第 n+1 个节点。我们可以使用两个指针 firstsecond 同时对链表进行遍历,并且 firstsecond 超前 n+1 步。当 first 遍历到链表末尾时,second 将指向倒数第 n+1 个节点。然后我们就可以调整 secondnext 指针来删除倒数第 n 个节点。

代码实现

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
 
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
    dummy = ListNode(0)
    dummy.next = head
    first = dummy
    second = dummy
    
    # 移动 first,使得 first 和 second 之间相隔 n+1 个节点
    for _ in range(n + 1):
        first = first.next
    
    # 同时移动 first 和 second,直到 first 指向链表末尾
    while first is not None:
        first = first.next
        second = second.next
    
    # 删除倒数第 n 个节点
    second.next = second.next.next
    
    return dummy.next

算法分析

  • 时间复杂度:O(L),其中 L 是链表的长度。算法对链表进行了一次遍历。
  • 空间复杂度:O(1),只用了常数级别的额外空间。

算法图解

初始状态

  • 假设链表为 1 -> 2 -> 3 -> 4 -> 5n = 2,目标是删除倒数第二个节点,即节点 4
  • 我们引入一个哑节点(dummy node)作为链表的新头节点,这样可以方便地处理边界情况,比如删除头节点。

表示链表的表格如下:

添加双指针

  • 设置两个指针 firstsecond,初始时都指向哑节点。

移动 first 指针

  • first 指针向前移动 n + 1 步,使得 firstsecond 之间相隔 n 个节点。

同时移动 firstsecond 指针

  • 同时移动 firstsecond 指针,直到 first 指向链表末尾的空节点。此时,second 将指向倒数第 n + 1 个节点。

删除倒数第 N 个节点

  • 调整 secondnext 指针,使其指向倒数第 n 个节点的下一个节点,从而删除倒数第 n 个节点。

结果

删除节点 4 后的链表为:1 -> 2 -> 3 -> 5

通过这种方法,我们只需要一趟扫描就能找到倒数第 n 个节点的位置,并进行删除操作,达到高效解决问题的目的。

结论

通过使用双指针的方法,我们可以高效地解决删除链表倒数第 N 个节点的问题,这个技巧在链表问题中非常实用,值得掌握。


欢迎关注微信公众号 数据分析螺丝钉

相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
201 1
|
9月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
存储
链表题目练习及讲解(下)
链表题目练习及讲解(下)
链表题目练习及讲解(上)
链表题目练习及讲解(上)
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
189 0
LeetCode第二十四题(两两交换链表中的节点)
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
245 0
Leetcode第十九题(删除链表的倒数第N个节点)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
210 0
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
318 0
|
Python
Python GUI tkinter 随机生成题目
说明 (1)拟设计的功能及实现思路、需要用到的知识 实现逐个显示题目,并且在点击按钮之后判断回答是否正确 实现可以统计正确率(在回答完所有题目之后) 实现指定题目的数量,指定题目的运算符号 实现将所有题目进行记录,并打印到word文档 实现将所有错误的题目进行记录,并打印到word文档 实现指定打印题目的行数和列数,并在界面进行展示 实现时刻提醒用户当前还剩下多少个题目没有解决 (2)调用库的说明 random 生成随机数要用到的库 tkinter 制作图形化界面要用到的库 docx 对word文档进行操作的库 docx.shared 里面的Pt 可以规定word文档的字体等规范
380 0
Python GUI tkinter 随机生成题目
|
6月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
883 102

推荐镜像

更多