删除链表倒数第n个节点

基本思路:

慢指针删除一个节点的操作需要三个节点完成,第二个节点是被删除节点,可以知道当慢指针移动到倒数第三个节点,指向最后一个节点的时候,倒数第二个节点是被删除节点。增加一个快指针,增加一个虚拟头节点,可以知道如果增加虚拟头节点,指针往后移动几步就等于当前节点的值。而快指针需要比慢指针三个节点最少多一个节点。快指针最少比慢指针多走2+1步(2是因为有虚拟头节点),当快指针比当前基础操作多加一个节点,被删除节点在快指针移动到末尾后距离快指针远离一个节点,即倒数第n个节点。所以快指针需要比慢指针快n+1个节点

建立虚拟节点

slow=fast=虚拟节点

对于i在n+1范围内:

        快指针往下移//快指针比慢指针多走n+1

当快指针存在:

        快指针后移

        慢指针后移

slow.next=slow.next.next//慢指针进行删除操作

返回虚拟头节点的下一个节点

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # 创建一个虚拟节点,并将其下一个指针设置为链表的头部
        dummy_head = ListNode(0, head)
        
        # 创建两个指针,慢指针和快指针,并将它们初始化为虚拟节点
        slow = fast = dummy_head
        
        # 快指针比慢指针快 n+1 步
        for i in range(n+1):
            fast = fast.next
        
        # 移动两个指针,直到快速指针到达链表的末尾
        while fast:
            slow = slow.next
            fast = fast.next
        
        # 通过更新第 (n-1) 个节点的 next 指针删除第 n 个节点
        slow.next = slow.next.next
        
        return dummy_head.next

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值