返回
二种方法让你写出最简洁的代码删除链表的倒数第 N 个结点
前端
2023-12-16 10:16:33
前言
链表是一种常见的数据结构,它存储数据元素并将其连接起来,形成一个序列。在许多编程任务中,我们可能需要删除链表中的某个结点,例如删除倒数第 N 个结点。
问题
给你一个链表的头结点 head
和一个整数 n
,请你删除链表中倒数第 n
个结点,并返回链表的头结点。
方法一:使用一趟扫描
以下是使用一趟扫描实现的代码:
def remove_nth_from_end(head, n):
dummy = ListNode(0)
dummy.next = head
first = dummy
second = dummy
# 让 first 指针先走 n 步
for _ in range(n):
first = first.next
# 然后 first 和 second 指针一起走,直到 first 指针到达链表末尾
while first.next:
first = first.next
second = second.next
# 将 second 指针指向要删除的结点的下一个结点
second.next = second.next.next
return dummy.next
这种方法的复杂度为 O(n),因为它只需要遍历链表一次。
方法二:使用两个指针
以下是使用两个指针实现的代码:
def remove_nth_from_end(head, n):
# 计算链表的长度
length = 0
current = head
while current:
length += 1
current = current.next
# 找到要删除的结点的前一个结点
previous = None
current = head
for _ in range(length - n):
previous = current
current = current.next
# 删除要删除的结点
if previous:
previous.next = current.next
else:
head = current.next
return head
这种方法的复杂度为 O(n),因为它需要遍历链表两次。
结论
我们已经为各位读者提供了两种简洁的代码来解决LeetCode 19: 删除链表的倒数第 N 个结点这个问题。方法之一使用一趟扫描,该方法更简洁、更高效,并且可以消除对计算列表长度的需要。方法之二使用两个指针来删除倒数第 N 个结点,这是一个更传统的方法。无论选择哪种方法,我们都为各位读者提供了清晰的步骤指南和一个易于理解的示例,帮助各位读者更好地理解和掌握如何解决这个问题。