19. Remove Nth Node From End of List

Given a linked list, remove the n-th node from the end of list and return its head.

Example:

1
2
3
Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:

Given n will always be valid.

Follow up:

Could you do this in one pass?

两趟算法

一趟算法

用两个指针,一个快指针先走n+2步.指向第n+2个节点.随后慢指针也从头节点出发,两个指针一起向前走.当快指针到达链表尾后节点时,慢指针指向的节点和尾后节点之间隔着n个节点,即慢指针指向倒数第n+1个节点.
这时候只需要删除慢指针指向的下一个节点即可.
有几种情况需要考虑:

  • 当链表中的总节点个数少于n个.无法删除倒数第n个节点.
  • 当链表中的总结点个数等于n个.要被删除的正好是头结点.
  • 当链表中的总结点个数大于n个.删除倒数第n个节点.

首先让快指针先走,要么走到第n+2个节点,要么走到尾后节点.
快指针先走之后,通过判断快指针共走过的节点个数来分情况处理.
若快指针共走过k个节点(包括最后一个尾后空节点)

  • 若k<=n,说明链表中节点个数少于n,快指针走过的节点中包括了尾后节点(空节点)
  • 若k==n+1,说明链表中节点个数为n,要删除的正是头结点
  • 若k==n+2,说明链表中至少有n+1个非空节点,可以删除倒数第n个节点.

AC代码

1
2