这个题解采用了双指针(快慢指针)的方法来找到倒数第n个节点。首先,创建一个哑节点(dummy node),这个节点的next指向链表的head,这样可以方便地处理边界情况,比如删除链表的头节点。算法首先将一个指针(first)向前移动n次,这样从first到链表末尾就会有n个节点。然后,同时移动两个指针(first和second),直到first指针到达链表末尾。这时,second指针会指向要删除节点的前一个节点。通过修改second的next指向,可以将倒数第n个节点从链表中删除。最后,返回dummy.next,即更新后的链表头节点。
时间复杂度: O(n)
空间复杂度: O(1)
# 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: ListNode, n: int) -> ListNode:
dummy = ListNode(0, head) # 创建一个哑节点,其next指向head
first = head # first指针初始指向head
second = dummy # second指针初始指向dummy,方便处理删除头节点的情况
for i in range(n):
first = first.next # 移动first指针n步
while first:
first = first.next # 同时移动first和second直到first到达末尾
second = second.next
second.next = second.next.next # 删除second的下一个节点,即倒数第n个节点
return dummy.next # 返回更新后的头节点