基本思路:
慢指针删除一个节点的操作需要三个节点完成,第二个节点是被删除节点,可以知道当慢指针移动到倒数第三个节点,指向最后一个节点的时候,倒数第二个节点是被删除节点。增加一个快指针,增加一个虚拟头节点,可以知道如果增加虚拟头节点,指针往后移动几步就等于当前节点的值。而快指针需要比慢指针三个节点最少多一个节点。快指针最少比慢指针多走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