返回
六六力扣刷题:优雅化解,删除单向列表中的倒数第N个节点
后端
2023-11-29 04:58:34
六六力扣刷题:删除单向列表中的倒数第 N 个节点
引言
作为一名勤奋的程序员,小六六深知算法和数据结构的重要性。Leetcode作为算法练习的宝库,自然成了我磨练技术的必经之路。今天,小六六要和大家分享一道Leetcode上的经典题目——删除单向列表中的倒数第N个节点。这道题不仅考验我们的算法能力,还锻炼了我们对数据结构的理解。
题目
给定一个单向列表head
和一个正数n
,要求删除列表中倒数第n
个节点。如果列表长度小于n
,则无需进行任何操作。
解题步骤
双指针法
解决这道题的关键在于巧妙运用双指针法。具体步骤如下:
- 创建两个指针:
slow
和fast
,它们都指向列表头节点head
。 - 移动快指针:
fast
指针先移动n
步,这样当fast
指针指向列表末尾时,slow
指针恰好指向倒数第n
个节点。 - 同时移动两个指针: 当
fast
指针不为null
时,slow
和fast
同时向右移动一步。 - 删除节点: 当
fast
指针移动到列表末尾时,slow
指针指向的就是倒数第n
个节点。此时,我们只需要删除这个节点即可。 - 返回新头节点: 如果倒数第
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天,点击查看活动详情