📜  数据结构 |链表 |问题 3(1)

📅  最后修改于: 2023-12-03 15:26:09.111000             🧑  作者: Mango

数据结构 | 链表 | 问题 3

问题描述

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

例如,给定一个链表: 1->2->3->4->5,n = 2,删除倒数第二个节点之后,链表变为 1->2->3->5。

注意:给定的 n 始终是有效的。

思路分析

此题需要删除链表的倒数第 n 个节点,那么可以考虑用双指针的方法。一个指针指向头节点,另一个指针比头指针晚 n 个节点,即第一个指针从链表头部移动 n 次后,第二个指针开始移动。当第二个指针移动到链表尾部时,第一个指针移动到链表倒数第 n 个节点,将其删除即可。

代码如下:

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        p1 = dummy
        p2 = dummy
        
        for i in range(n):
            p2 = p2.next
            
        while p2.next:
            p1 = p1.next
            p2 = p2.next
            
        p1.next = p1.next.next
        
        return dummy.next

具体解释如下:

  • 定义 dummy 节点,其值为 0,在一个新的节点上进行操作,最后可以直接返回 dummy.next 。
  • p1 和 p2 指针都指向 dummy 节点。
  • p2 指针先向前移动 n 次,即指向头节点的后面第 n 个节点。
  • 当 p2 指向最后一个节点时,p1 指向了倒数第 n+1 个节点。
  • 接着将 p1 的 next 指向其 next.next,即删除倒数第 n 个节点。
复杂度分析

时间复杂度为 O(L),其中 L 是链表的长度,需要遍历一次链表来找到倒数第 n 个节点并删除。空间复杂度为 O(1),需要两个指针来维护节点位置。

以上是对该问题的分析和解决方法,通过本篇文章的阅读,相信您已经掌握了这个问题的解决思路和实现方法。如果在阅读过程中还有不懂的地方或者需要更深入的讨论和交流,欢迎在评论区留言和我一起探讨,我会尽快回复您的问题。