问题描述

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

示例:

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

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

说明:

给定的 n 保证是有效的。

进阶:

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

解决方案

双指针的策略

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

show me the code

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

另一种巧妙的方式

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

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

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

14. 不修改数组找出重复的数字 上一篇
我的2019计划 下一篇