该题解使用了快慢指针的方法。首先让快指针先走 n 步,然后快慢指针同时向前移动,直到快指针到达链表尾部。此时慢指针指向的就是倒数第 n 个节点的前一个节点,把慢指针的 next 指针指向 next.next,即可删除倒数第 n 个节点。特殊情况是如果快指针走了 n 步后为 None,说明要删除的是头节点,直接返回 head.next 即可。
时间复杂度: O(m),其中 m 为链表的长度
空间复杂度: O(1)
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
if head.next is None: # 如果链表只有一个节点
return
f = s = head # 快慢指针初始化
for _ in range(n): # 快指针先走 n 步
f = f.next
if f is None: # 如果快指针走了n步后为None,说明要删除的是头节点
return head.next
while f.next: # 快慢指针同时向前,直到快指针到达尾部
f = f.next
s = s.next
s.next = s.next.next # 删除倒数第 n 个节点
return head