【leet-code清晰解题思路💯✅】19. 删除链表的倒数第 N 个结点

51 阅读1分钟

题目描述

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

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶: 你能尝试使用一趟扫描实现吗?

解题思路

  • 可以先计算整个链表的长度,然后删除倒数第k个即可
// 计算长度+遍历
func removeNthFromEnd(head *ListNode, n int) *ListNode {
   l, h := 0, head
   for h != nil {
      l++
      h = h.Next
   }
   if l == n {
      return head.Next
   }
   h = head
   for i := 0; i < l-n-1; i++ {
      h = h.Next
   }
   h.Next = h.Next.Next
   return head
}

image.png

  • 也可以用双指针,右边的指针先走k步,然后两指针同时向右走,右指针到头,删除左指针的数即可
// 双指针
func removeNthFromEnd2(head *ListNode, n int) *ListNode {
   h1, h2 := head, head
   for i := 0; i <= n; i++ {
      if h2 == nil {
         return head.Next
      }
      h2 = h2.Next
   }
   for h2 != nil {
      h1 = h1.Next
      h2 = h2.Next
   }
   h1.Next = h1.Next.Next
   return head
}

image.png