19. 删除链表的倒数第N个节点

本文最后更新于:2024年4月20日 下午

问题描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

1
2
3
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解决方案

双指针的策略

  • 设置快、慢两个节点
  • 快节点向前走N步
    • 如果快节点向前走了N步,此时快节点本身已经为None,说明要删除的节点是头节点
  • 此时慢节点启动,一起向下遍历
  • 当快节点遍历到最后一个节点时
  • 慢节点的下一个节点,即是要被删除的节点

show me the code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
fast = slow = head
for _ in range(n):
fast = fast.next
if not fast:
return head.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return head

另一种巧妙的方式

相当于使指针设置在了头结点前,消除了一些边界情况

1
2
3
4
5
6
7
8
9
10
11
def removeNthFromEnd(self, head, n):
slow = fast = self
self.next = head
while fast.next:
if n:
n -= 1
else:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return self.next

19. 删除链表的倒数第N个节点
https://yance.wiki/19问题描述/
作者
Yance Huang
发布于
2019年1月31日
许可协议