【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?
本问题对应课程链接:剑指offer刷题第五期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
参考答案:没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。
共以下 24 个回答
没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常
1、没有考虑到删除头节点的情况,
2、n大于链表长度的情况也未考虑
没考虑到头节点,以及快指针应该是n-1为fast才行,不能再往下next
没有考虑到当n的值等于或者大于链表长度的情况:
如果n的长度等于链表长度,此时要删除的节点是第一个节点,也就是说pre会为空,此时应该是head = head.next,并返回head;
如果n的长度大于链表长度此时不应该执行删除节点操作
若删除的是头节点,则第一个循环后fast为NULL,pre为NULL,无法进入第二个循环,pre值为NULL,无法调用pre->next。
没有考虑n超过链表长度时的情况
以及删除只有头结点的情况
删除节点时没有考虑到删除头节点的情况
删除节点时,将头节点 中部节点 末尾节点的情况都分析分析。一般中部节点与尾节点处理是相同的。头节点需要特殊处理。
当删除的是头节点的时候,会出现问题。pre为nullptr,pre->next复制就会出现问题。
没有考虑头节点问题。一般解决链表问题时要注意特殊情况就是头节点,可以考虑建立一个虚拟头节点解决。或者自己额外写代码对头节点进行特殊处理。另外就是一般需要注意空指针问题,这个就考验代码能力了。
快指针 fast 先走 n 步,然后快慢指针同时往后走,走到 fast 为 null 时 slow 就是倒数第 n 个节点
视频存在的问题是 fast 和 slow 都初始化为 head 头节点,假设要删除的就是头节点,那么第一个 while 时 fast 就已经为 null 了,无法进入第二个 while,出现 NPE。
1、可以在第二个 while 后面加个判断
if(slow.next ==head){ head = head.next} else {正常的删除};2、更好的方式是添加虚拟头节点 dummy,初始化时都指向 dummy,删除不需要特殊判断,最后返回 dummy.next 即可要注意到在循环时快指针会比慢指针先进入null,因此他所写的代码在示例二的情况下fast.next直接为null,并且赋值回fast中。这就会导致对第二个while的判断为不进入循环,那么slow的值不会添加到pre中,在后面pre->next=slow->next语句中的pre仍然是初始设置的null,不存在next,赋值报错。
所有的删除题目都很容易把人绕晕,因为删除题目涉及到.next.next,所以一般最少要为两个节点,head None or head.next None,无节点或者1个节点的时候 都应当直接删除。然后在考虑normal的情况
只有一个节点情况未考虑
在第二個示例時 由於只有一個節點, 在第一個循環時fast會指向 NULL 因此就不會進入第二個節點, 這時的pre還是NULL 如果呼叫pre->next=slow->next就會報錯
没考虑头节点被删除
边界没处理好吧
边界未处理
如果只有head节点 ,pre为空没有经过第二个while循环,导致pre.next报错
在n递减控制while循环时,如果正好要获取的是倒数第一个节点,fast最后会指向空。不需要以n来控制fast指针的步伐,只要保证slow指针是比fast慢n步出发即可,最终的遍历结束条件应该是fast指向空
只有一个节点时,进行最后一步时pre为空指针,pre.next会报错
示例2会报错;由于链表只有一个元素,fast在第一个循环中就为null了,这导致不会执行第二个循环。进而导致pre依旧为空指针,从而pre.next = slow.next 会报错