【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?
本问题对应课程链接:剑指offer刷题第四期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
本问题对应课程链接:剑指offer刷题第四期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
共以下 36 个回答
在第一个循环中应判断fast的Next是否为空
第一个循环之后,fast可能为空,不会进入第二个循环,直接导致pre.next空指针
第一个while循环结束可能存在链表szn的情况,此时fast指向空,第二个while循环条件为假,pre为空,进行操作会导致程序挂死
没有对fast为空进行判断
1.fast会空,但不是主要问题,因为题目限定了1<=n<=sz,最差情况 n=sz,fast此时为null,不会进入第二循环
2.问题在于,当n=sz时,返回结果有问题,没进入第二个删除循环,应该定义一个result节点,result.next=head
最后 return result.next
第一个while循环要对fast是否为空进行判断
fast.next为空时,不会进入第二个循环,pre为空,无法删除
在第一个循环中应判断fast的Next是否为空
在第一个循环中应判断fast的Next是否为空
第二个while循环需进行fast为空判断
少了fast判空处理
会空,如果只有一个节点 fast执行完指向的不是那个节点而是已经变成了空,进入不到第二个循环里面,
快指针先走K步,当输入为空链表时返回nullptr
for(int i=0;i<k;i++){
if(fastnullptr){
return nullptr;
}
fast = fast->next;
}
第一个循环,fast可能会NULL,应该进行判断
当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead
当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead
当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead
当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead
当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead
如果要删除第一个结点的话,fast在第一个循环后会指向nullptr,第二个循环不会发生。
二
在第一个循环中应判断fast的Next是否为空
直接建立一个头节点不就得了吗?n的范围是 1<= n <= sz,建立个头节点,也不用第一个循环判断是不是为空了
判断边界条件,由于0 <= n <= sz, 如果n = 0, 直接返回head即可; 如果n = sz, 即删除首元节点, 此时fast在第一个循环会指向null,不会参与第二个循环,直接返回head->next即可。
在第一个循环,fast可能会走到null,那就意味着走不到第二个循环,那pre默认为null,pre->next 也就会报错了。
例如第二个样例:循环出来的时候fast已经是null了,此时应该做一个判断 fast是否为null,如果是空的话,应该直接返回null。
并且本题也说明了n是在sz以内的,所以上面的限制针对的是当n 等于节点总数的情况。也就是要删除的节点是头节点的情况。此时出循环后fast如果是null的话返回head.next就行了。
在第一个循环中要判断fast是否为空
在fast先走n步后,要进行判断fast是否为NULL,如果是就直接返回NULL.
第一个循环判断时应判断Next是否为空
第二个测试样例就无法通过。因为就一个节点,还把这个节点删除了,那么在第二个循环中fast就为空了。不会进入第二个循环。这种题目感觉还是在最开始的时候设置虚拟头节点比较好,输出head就用dummy->next。
如果不采用虚拟头节点的话。需要在第二个循环前面判断fast是否已经是空节点了。
需要判断fast是否为空
在第一个循环fast指向的next中,需要进行判断是否为null,若是null,运行会报错
删除的是head结点时,要进行判断,返回的是head.next
删除的是第一个节点时,fast指针在第一个循环会指向null,此时不会进入第二个循环,运行报错。
如代码第二行需要判断当前fast是否为空,要不然空结点的next会报错
在第一个循环fast指向next中,要判断fast是否为空,才能继续,否则空结点nexr会直接报错
第一个循环的fast会空,如果n正好是linkedlist的长度,fast最后指空。在这种情况下,不会进入第二个while loop, 所以后面的prev->next = slow->next会直接报错。
应该在两个loop之间做一个check? 如果为空就说明要删除的是头结点,做对应操作。