目录
1.题目描述
2.题目分析
对于这个题目,我一开始是想用递归迭代去达到删除倒数第n个节点的目的。但是思考了半天都没有头绪,于是去看了一下众多大佬的解题思路。被快慢指针法惊到了,所以我们这次就用所谓的快慢指针法来做这个题目。
快慢指针是指,用一个早出发的指针fast,和一个慢出发的指针slow来确保我们删除的节点是列表的倒数第N个数的方法。你想,快指针fast先走出N个步长,这个时候两个指针的距离是不是就是N了,然后我们再让快慢两个指针同时往后走,当快指针走完链表时,慢指针走到的就是倒数第N个数了。
这道题在做的时候最好需要设置一个哑节点来指向表头,这样就可以避免当链表只有一个元素的尴尬情况。(第18行后,注释的代码是不需要哑节点的方法,大家也可以看一下)
3.代码实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy = ListNode(next=head)
fast = dummy
slow = dummy
for i in range(n+1):
fast = fast.next
while fast is not None:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next
# fast = head
# slow = head
# for i in range(n):
# fast = fast.next
# if fast is None:
# return head.next
# while fast.next is not None:
# fast = fast.next
# slow = slow.next
# slow.next = slow.next.next
# return head