题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
**思路:**双指针
1、定义两个指针,右指针先走n步,然后左右指针一起走,可以发现左右指针之间的距离一直是n,就可以找到第n+1个指针。
2、删除第n个节点,需要找到倒数第n+1个节点,然后让上一个指针的节点指向倒数第n+1个节点,即
left.next=left.next.next
Python:
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
# 创建一个虚拟节点
dummy=ListNode(next=head)
# 右指针等于这个虚拟节点
right=dummy
# 遍历这个链表,让右指针走n步
for _ in range(n):
right=right.next
# 左指针等于这个虚拟节点
left=dummy
# 左右指针都走n步
while right.next:
left=left.next
right=right.next
# 删除倒数第n+1个节点
left.next=left.next.next
return dummy.next
复杂度分析:
时间复杂度:O(m),其中 m 为链表的长度
空间复杂度:O(1),仅用到若干额外变量。