风之所向,吾之所往

GEEK

极客——次时代博客

控制台

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

问题描述

给定一个链表,删除链表的倒数第 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
0
0
  • # 1楼    2019-05-20 13:49   root 回复

    import { serif } from "wired-fonts" serif("I love you three thousand.", { fontStyle: "bold-italic" })

  • # 2楼    2019-05-20 13:50   root 回复

    标签很有灵性……

发表评论

昵称:

评论内容: