leetcode打卡-0019删除链表的倒数第N个结点

题目描述

给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。

解题思路

1. 快慢指针

单链表的遍历方向只能从头到尾单向遍历,如果要删除倒数第N个节点,就意味着后面还有N-1步才能遍历到末尾。

所以考虑用快慢指针的方法,快指针先走N-1步,然后两个指针再同时前进,这样当快指针走到末尾时,慢指针正好指向倒数第N个节点。

不过为了便于删除节点,当慢指针指向倒数第N+1个节点时就停下来即可,所以,先让快指针走N步。代码如下:

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        fast = head
        slow = head

        # 快指针先走N步
        for _ in range(n):
            fast = fast.next

        # 如果快指针走完了整个链表,那么链表长度为N,倒数第N个即头节点
        if fast is None:
            return head.next

        while fast.next:
            fast = fast.next
            slow = slow.next

        slow.next = slow.next.next

        return head
  • 时间复杂度: O(n),其中n是链表的长度
  • 空间复杂度: O(1)

总结

单链表由于其方向上的一致性,运用双指针解法时候一般优先考虑快慢指针。