19. 删除链表的倒数第 N 个结点
题目很简单,实际上就是双指针,两个指针间隔一定距离,使得在快指针指向空的时候,慢指针要指向倒数低n+1个元素,于是就得到其实是要寻找第倒数n+1个元素。
但题目的难点在于边界问题。实际上边界问题才是对我们最大的考验,边界永远是衡量你建模是否准备的重要标准。
这题的边界就在,当我初始操作快指针指为null的时候,有两种情况:
- 链表太小
- 刚好链表只有n+1个元素
同时,为了程序的健壮性,在指针访问前,请确保指针不为空,访问数组时候,确保不会越界。所以这题我不喜欢官方给的参考答案,只为写题而写题,没有培养较好的编程习惯。
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) return head;
ListNode l1 = head;
ListNode l2 = head;
int step = 0;
while (l1 != null && step++ < n + 1) {
l1 = l1.next;
}
if (l1 == null && step != n + 1) return head.next;
while (l1 != null) {
l1 = l1.next;
l2 = l2.next;
}
l2.next = l2.next.next;
return head;
}