【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?
本问题对应课程链接:剑指offer刷题第六期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
参考答案:没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。
共以下 35 个回答
没有考虑k为n的特殊情况,会出现空指针
删除第一个节点时,fast走到nullptr,不进循环,pre未被赋值还是nullptr,为pre->next赋值时报错。
没有考虑k为n的特殊情况
如果删除的是第一个节点,会出现空指针情况,fast指针未考虑指向空情况
如果n等于链表长度,即删除链表的头节点,那么此时fast为nullptr,第二个删除操作的while循环就无法进入,pre为nullptr,最后一步就会出现pre->next,解引用空指针的成员。
如果删除的是第一个节点,会出现空指针情况
fast指针未考虑指向空情况
没有考虑空指针
没有考虑头节点
没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。
时间复杂度:O(n)
空间复杂度:O(1)
没有考虑头节点为空指针的情况,最好再设一个虚拟头节点
没有考虑空指针
忽略了边界值,会出现空指针异常
未考虑空指针情况。while 循环中删除头节点处理不妥当
删除是头节点的时候,prev是空指针
pre节点初始设置为null,如果要删除的是头节点就会出错
删除的是head的时候,会出现空指针异常/
要进行删除操作,最好使用带有头结点的链表,因为在寻找结点的第一个while中,如果删除第一个结点的话,fast就指向了nullptr,无法进行第二个while
如果删除的是头节点,则出错
没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。
在while循环过程中,没有考虑链表是否有n个元素,遍历时可能为空
未考虑边界情况,指针指向null
问题:边界处理,若要删除的是头结点,那么slow和pre指向的是同一个节点,可能会出错
修改方法:开一个虚拟的头结点放在head前面,pre指向此虚拟头结点
没有考虑空指针问题
“`CPP
//需要考虑边界处理
如果删除的是第一个节点,那么此时pre为 null,最后调用 pre.next 就会出问题。
改正之后:
一定要考虑null的问题
如果删除的是第一个节点,那么此时pre没有指向第一个节点的前驱结点。应该使用一个虚拟头结点。
感觉涉及到链表插入删除的时候做一个虚拟头节点会好很多
视频中代码将pre初始设置为null,如果需要删除的节点为倒数第n个,也就是第1个,这时候pre.next=slow.next就会有空指针异常,感觉单独进行判断或者初始化时候添加一个头指针辅助可能可以解决
边界情况,当删除第一个节点的时候,第一个while的fast其实已经为空了。第二个while不会继续执行。
感觉视频中这段代码没有考虑当n为链表长度时的情况,这是在while循环后,fast始终是指向空指针的,则第二个循环始终无法进入,pre就会是空指针。