思路
暴力解法:先遍历得到链表长度N,再从头遍历到N-n位置(假设最后一个结点位置是N)将其下一个结点链到其下下个节点上,输出头节点
可以通过快慢指针的方式,将这两次遍历变成一次,即快指针领先慢指针n步,当快指针遍历到尾结点N时,慢指针恰好到N-n位置
解题方法
dummy作为虚拟头结点,其下一个结点是输入头节点,初始化快慢指针,在dummy结点处,先让快指针跑n步,再让快慢指针一起往后走,直到快指针到达尾结点(fast.next=None) 删除慢指针的next结点,输出当前头节点
复杂度
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
# 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(0)
dummy.next = head
fast, slow = dummy, dummy
for i in range(n):
fast = fast.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next