返回
LeetCode 019:逐个剖析,删除链表倒数第 N 个结点
IOS
2023-09-30 02:38:29
在 LeetCode 的题库中,HOT100 题目以其经典性、代表性而闻名。今天,我们一起来挑战 HOT100 中的第 19 题:删除链表的倒数第 N 个结点。
背景介绍
链表是一种广泛应用于计算机科学中的数据结构,它由一组相互连接的结点组成,每个结点包含一个值和指向下一个结点的指针。删除链表中的特定结点是一个常见且关键的操作。
题目
给你一个链表的头节点 head
和一个整数 n
,请删除链表的倒数第 n
个结点,并返回链表的头节点。
示例
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
解题思路
这道题目的本质是找到链表中倒数第 n
个结点,并将其删除。我们可以采用以下步骤解决问题:
- 遍历链表,计算长度 :首先,遍历链表,计算其长度
length
。 - 找到倒数第 N 个结点 :根据
length
和n
,计算倒数第n
个结点的索引index
。索引index
为length - n
。 - 删除结点 :遍历链表到索引
index
处,将该结点从链表中删除。
代码实现
def remove_nth_from_end(head: Optional[ListNode], n: int) -> Optional[ListNode]:
# 1. 遍历链表,计算长度
length = 0
curr = head
while curr:
length += 1
curr = curr.next
# 2. 找到倒数第 N 个结点的索引
index = length - n
# 3. 删除结点
if index == 0:
return head.next
curr = head
prev = None
while index > 0:
prev = curr
curr = curr.next
index -= 1
prev.next = curr.next
return head
复杂度分析
- 时间复杂度:O(n) ,其中
n
是链表的长度。 - 空间复杂度:O(1) ,因为我们不需要额外的空间。
总结
通过逐个剖析 LeetCode 019 题,我们掌握了删除链表倒数第 n
个结点的算法。这种解题思路既简单又高效,适用于解决各种链表操作问题。
此外,解决 LeetCode 题目的过程不仅可以提高我们的编程能力,还可以培养我们的算法思维。通过每天坚持刷题,相信我们可以逐渐养成持续学习的习惯,在计算机科学领域不断提升自己。