19. 删除链表的倒数第 N 个结点(中)

发布时间 2023-10-29 16:55:02作者: Frommoon

题目

  • 给你一个链表,删除链表的倒数第 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]

法一、循环

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # Step 1: 获取链表长度
        length = 0
        cur = head
        while cur != None:
            length += 1
            cur = cur.next

        # 处理删除头节点的情况
        if length == n:
            return head.next

        # Step 2: 找到倒数第 N 个节点的前一个节点
        cur = head
        for _ in range(length - n - 1):
            cur = cur.next

        # Step 3: 删除节点,并重新连接
        cur.next = cur.next.next
        return head
  • for _ in range(length - n - 1):下划线 _ 是一个通用的变量名,通常用于表示一个临时或不需要使用的变量。在循环中,它表示一个占位符,用于表示我们不需要使用循环变量的值。

法二、快慢指针

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # 初始化快慢指针
        slow = head
        fast = head
        # 将快指针向前移动 n 步
        for _ in range(n):
            fast = fast.next
        # 处理删除头节点的情况
        if fast is None:
            return head.next
        # 同时移动快慢指针,直到快指针到达链表末尾
        while fast.next != None:
            slow = slow.next
            fast = fast.next
        # 删除倒数第 N 个节点
        slow.next = slow.next.next
        return head