代码重构:leetcode 19. 删除链表的倒数第 N 个结点

128 阅读1分钟

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;
    }