【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?
本问题对应课程链接:剑指offer刷题第七期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
参考答案:没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。
共以下 26 个回答
要考虑删除头节点
需要考虑空指针的问题,如果删除的是头节点就会出现异常;另外在面试时,如果面试官问哪一步还有没有问题,有可能是面试官在给提示,一定要多想一想
需要考虑删除头节点的情况
没有考虑到删除头节点的情况
需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点
需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点
需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点
没有考虑删除头节点的情况
没有考虑头节点
没有考虑删除头结点的情况
第一个while循环,有可能删除到第一个节点,导致为空
如果是要删除头结点,第一个循环结束后fast已经为空了,可以设置一个辅助头节点,slow=dum fast=head;这样最后停下时,slow正好是要删除的前一个节点,也不用再声明变量pre
第一个while循环,当sz=n的时候,fast->next就为空了
没有考虑空指针的特殊情况
循环时直接在fast上进行了操作,出循环后没有重新赋值,一直是空指针,后续的代码也没有处理空指针的临界情况。
看了下视频和大家的题解,就是边界情况的处理问题。n=sz的时候,fast快指针已经跑到链表最后一个的next了,所以是null,没办法进入第二个while循环,所以pre也还是初始值null,并没有被赋成slow
没有考虑删除头结点的情况
没有考虑删除头结点的情况,此时调用pre.next会出现空指针异常。可以考虑使用辅助头结点,修改如下:
空指针问题:由于sz>=n,所以唯一的空指针情况就可能出在,szn时,所以只需要加一个删除首节点(倒数第sz个节点)情况的处理就可以了。
n = sz 时,第一个while最后会跑到头,而此时fast.next已经是null了,赋值给fast
第二个while会被直接跳过。
错误:在快指针fast前进时需要判断是否为null。
若fast前进过程时为null,说明n>=sz。题目约束了n<=sz。
所以n=sz,说明要删除的是头节点,此时应该直接return head->next;
没有考虑需要删除头节点的情况,最好定义一个前置节点指向头节点
① 头节点的删除需要额外判断
② 题目要求
0 <= n<= sz,说明cnt的取值一定在链表内,因此在第一个while循环内移动fast指针的过程中,当fast == null时,while循环一定也结束了。也就是说fast可以走完n步,但是当fast == null时,第二个循环无法进入,pre依旧是nullptr,那么最后的pre->next就会出错。没考虑删的是第一个节点的情况
1.在开头没有进行防御性编程,没有考虑Head为nullptr的情况;2.在fast走前k步时没有考虑无法走完前k步的情况。