written at 20/06/02

题目描述

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

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

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

说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

Solution 1: 因为需要一趟扫描实现,最直观的思路就是利用递归先正向搜一遍,反向回溯的时候进行所需操作的处理。( 注意: 需要注意当需要删除第一个元素的时候,因为给定的链表是不带空头指针的,为了方便可以加个空的头指针)
Solution 2: 利用链表的时间差遍历。即一个快速链表先遍历LeetCode 19 - 删除链表的倒数第N个节点 - 图1个节点,然后另一个慢速链表再开始遍历,则快速链表遍历完后,慢速链表所指定的位置便是倒数第LeetCode 19 - 删除链表的倒数第N个节点 - 图2个节点

代码

Solution 1

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def serach_and_delete(self, now, n):
  8. if now.next == None:
  9. return 1
  10. reposition = self.serach_and_delete(now.next, n) + 1
  11. if reposition == n+1:
  12. now.next = now.next.next
  13. return reposition
  14. def removeNthFromEnd(self, head, n):
  15. """
  16. :type head: ListNode
  17. :type n: int
  18. :rtype: ListNode
  19. """
  20. blank_node = ListNode(0) # mark
  21. blank_node.next = head
  22. self.serach_and_delete(blank_node, n)
  23. return blank_node.next

Solution 2

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def removeNthFromEnd(self, head, n):
  8. """
  9. :type head: ListNode
  10. :type n: int
  11. :rtype: ListNode
  12. """
  13. blank_node = ListNode(0) # 添加空白头指针
  14. blank_node.next = head
  15. fast_list = blank_node
  16. for _ in range(n):
  17. fast_list = fast_list.next
  18. slow_list = blank_node
  19. while fast_list.next != None:
  20. fast_list = fast_list.next
  21. slow_list = slow_list.next
  22. slow_list.next = slow_list.next.next
  23. return blank_node.next