力扣题目 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 个节点的问题,这个技巧在链表问题中非常实用,值得掌握。


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

相关文章
|
4月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
51 1
|
4月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
65 0
Leetcode第21题(合并两个有序链表)
|
4月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
93 1
|
4月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
42 0
LeetCode第二十四题(两两交换链表中的节点)
|
4月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
54 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
4月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
66 0
|
4月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
35 0
|
4月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
121 0
|
8月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
8月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表

热门文章

最新文章