返回

六六力扣刷题:优雅化解,删除单向列表中的倒数第N个节点

后端

六六力扣刷题:删除单向列表中的倒数第 N 个节点

引言

作为一名勤奋的程序员,小六六深知算法和数据结构的重要性。Leetcode作为算法练习的宝库,自然成了我磨练技术的必经之路。今天,小六六要和大家分享一道Leetcode上的经典题目——删除单向列表中的倒数第N个节点。这道题不仅考验我们的算法能力,还锻炼了我们对数据结构的理解。

题目

给定一个单向列表head和一个正数n,要求删除列表中倒数第n个节点。如果列表长度小于n,则无需进行任何操作。

解题步骤

双指针法

解决这道题的关键在于巧妙运用双指针法。具体步骤如下:

  1. 创建两个指针: slowfast,它们都指向列表头节点head
  2. 移动快指针: fast指针先移动n步,这样当fast指针指向列表末尾时,slow指针恰好指向倒数第n个节点。
  3. 同时移动两个指针:fast指针不为null时,slowfast同时向右移动一步。
  4. 删除节点:fast指针移动到列表末尾时,slow指针指向的就是倒数第n个节点。此时,我们只需要删除这个节点即可。
  5. 返回新头节点: 如果倒数第n个节点恰好是头节点,则返回slow.next作为新的头节点;否则,直接返回原来的头节点head

代码实现

def remove_nth_from_end(head, n):
  """
  删除单向列表中倒数第n个节点

  :param head: 头节点
  :param n: 要删除的节点序号
  :return: 删除后的新头节点
  """

  # 创建两个指针
  slow = head
  fast = head

  # 移动快指针
  for _ in range(n):
    fast = fast.next

  # 同时移动两个指针
  while fast:
    slow = slow.next
    fast = fast.next

  # 删除节点
  if slow == head:
    return head.next
  else:
    slow.next = slow.next.next
    return head

示例

对于输入列表[1,2,3,4,5]n=2,输出应为[1,2,3,5]

总结

删除单向列表中的倒数第n个节点是Leetcode上一道经典的题目,考验了我们对双指针法和单向列表的理解。通过这道题的练习,我们不仅提高了算法能力,还加深了对数据结构的掌握。小六六鼓励大家多多刷题,不断提升自己的编程技能。

持续创造,永不止步! 这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情