返回
链表操作必备:巧妙删除链表的倒数第 N 个结点
前端
2023-09-03 09:48:49
倒数第 N 个结点的删除算法
在单链表中删除倒数第 N 个结点,需要考虑以下情况:
- 如果链表的长度小于 N,则无法删除该结点。
- 如果链表的长度等于 N,则需要删除头结点。
- 如果链表的长度大于 N,则需要找到倒数第 N 个结点的前一个结点,并将其指向倒数第 N 个结点的下一个结点。
为了解决这些情况,我们使用双指针技术。第一个指针从链表的头结点开始,第二个指针从倒数第 N 个结点开始。两个指针同时向后移动,直到第二个指针到达链表的尾结点。此时,第一个指针指向的结点就是倒数第 N 个结点的下一个结点。我们只需要将第一个指针指向的结点的下一个结点指向倒数第 N 个结点的下一个结点,就可以完成删除操作。
代码实现
以下是用 Python 实现的删除倒数第 N 个结点的算法代码:
def remove_nth_from_end(head, n):
"""
删除链表的倒数第 N 个结点
Args:
head: 链表的头结点
n: 要删除的结点的倒数序号
Returns:
删除后的链表的头结点
"""
# 检查链表是否为空或 N 无效
if not head or n <= 0:
return head
# 创建两个指针,一个从头结点开始,一个从倒数第 N 个结点开始
first_pointer = head
second_pointer = head
for _ in range(n - 1):
if second_pointer.next is None:
# 如果链表的长度小于 N,则无法删除该结点
return head
second_pointer = second_pointer.next
# 两个指针同时向后移动,直到第二个指针到达链表的尾结点
while second_pointer.next is not None:
first_pointer = first_pointer.next
second_pointer = second_pointer.next
# 删除倒数第 N 个结点
first_pointer.next = first_pointer.next.next
# 返回删除后的链表的头结点
return head
时间复杂度和空间复杂度
该算法的时间复杂度为 O(n),其中 n 是链表的长度。算法只需要遍历链表一次,因此时间复杂度为 O(n)。算法的空间复杂度为 O(1),因为算法只需要使用两个指针,而指针只占用常数的空间。
结语
删除链表的倒数第 N 个结点是一种常见的链表操作,该算法利用双指针技术,巧妙地解决了这个问题,使时间复杂度保持在 O(n)。算法原理简单易懂,并附带详细的代码实现,是链表操作不可或缺的技巧。