19. 删除链表的倒数第 N 个结点

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:

        dummy = ListNode(0, head)
        p = q = dummy

        for _ in range(n + 1):
            q = q.next

        while q:
            q = q.next
            p = p.next

        p.next = p.next.next

        return dummy.next

逐步解释这段代码:

  1. 定义类和函数:

    • class Solution:: 定义一个名为 Solution 的类。
    • def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:: 定义一个方法 removeNthFromEnd,它接受一个链表头节点 head 和一个整数 n,返回一个链表头节点。
  2. 初始化哑节点:

    • dummy = ListNode(0, head): 创建一个哑节点 dummy,并将其 next 指针指向链表的头节点 head。哑节点的值(这里为 0)是任意的,重要的是它有一个 next 指针指向链表的第一个节点。
  3. 初始化双指针:

    • p = q = dummy: 初始化两个指针 p 和 q,并将它们都指向哑节点 dummy。这两个指针将用于遍历链表,其中 q 会先走 n+1 步,然后 p 和 q 会一起移动,直到 q 到达链表的末尾。
  4. 移动 q 指针:

    • for _ in range(n + 1):: 使用一个循环来移动 q 指针 n+1 步。
    • q = q.next: 在循环中,将 q 移动到链表的第 n+1 个节点。
  5. 同步移动 p 和 q 指针:

    • while q:: 当 q 指针不为空时,循环继续。
      • q = q.next: 移动 q 指针到下一个节点。由于 q 最初比 p 多走了 n+1 步,所以在这个循环中,当 q 到达链表末尾时,p 将指向倒数第 n+1 个节点。
      • p = p.next: 移动 p 指针到下一个节点。
  6. 移除节点:

    • p.next = p.next.next: 此时 p 指向倒数第 n+1 个节点,因此 p.next 指向要移除的倒数第 n 个节点。通过改变 p.next 的指向,我们跳过了要移除的节点,实现了删除操作。
  7. 返回结果:

    • return dummy.next: 因为我们使用了哑节点,所以返回 dummy.next 作为新的链表头节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值