【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?
本问题对应课程链接:剑指offer刷题第三期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
本问题对应课程链接:剑指offer刷题第三期
这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。
现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了
共以下 50 个回答
没考虑好只有一个节点
没有单独考虑删除的节点是头节点的情况
没考虑删除头节点
没考虑n大于链表长度的情况,第一个while需要加判断fast为空
没有考虑删除的是头结点的情况,建议增删改类的链表题都建立虚拟头结点好一致对待
头结点问题,第一个结点就是目标结点的情况,要么就创建一个虚拟头节点来统一处理删除头节点和非头节点的情况
空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针
没有单独考虑一个节点或者删除头结点的情况,可以加一个判断if(cur->next nullptr) return nullptr;
1.要判断while循环时,fast->next指针可能为空的情况,这时候可能给出的n大于链表的长度
2.链表只有一个节点时,pre是空指针异常,n=1时也没能删除链表中的节点,可以加一个判断(head->next NULL && n 1) || head NULL,返回NULL
很明显,没有考虑仅含一个节点的情况。若仅含一个节点,第一个while循环结束时fast已经到达null,不会进入第二个循环,这时pre指针仍为npt,不存在next。
打卡,综合视频和评论区,发现主要有以下问题:
1.快指针前进n步时没有考虑fast为null的情况;
2.没有考虑删除的节点是头节点的情况。
没考虑删除头节点
没考虑n大于链表长度的情况
没考虑待删节点是头节点的情况,可能导致空指针引用异常
结合评论道友们的评论来看,让自己养成好习惯,先对特殊情况进行判断,比如头结点问题(判断是否只有一个结点)和空指针问题(判断是否为空指针并处理),以及遇到删除结点时可以先创建一个虚拟结点辅助.
没考虑删除头节点
头结点问题,第一个结点就是目标结点的情况
空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针
边界问题,fast的next得判断空,还有删除头节点的时候有问题。
头节点
遇到删除节点的,最好构造虚拟节点,否则如果删的是头结点,不好处理
删除节点依赖前驱节点进行删除,删除头结点时没有前驱节点,解决方案是创建哑节点指向头结点
没考虑删除头节点
删除头节点时的边界问题,需要建立虚拟头节点
未能考虑目标节点为第一个头节点的情况
这个fast指针next的时候是不是得判断空,还有问下设置虚拟头节点有什么好处啊?是防止删除头节点?
看不懂c++哇,但感觉头节点好像是没判断
c++判断边界应该判断为while(fast->next!=NULL)
头结点问题,第一个结点就是目标结点的情况
空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针
没有考虑删除头节点时的边界问题
当n等于链表长度,以上代码会出现空指针。只需要在第二个while(fast) 前加个if(fast) return head->next;即可
删除头节点出现问题 可建造虚拟节点使其next 初始为head
当要删除头节点时,此时pre是空的,pre->next会报错。
n=1报错
在遇到可能删除头结点的问题时,使用虚拟节点,这样不会导致删除时出现null指向next
此题可能删除第一个节点,这样 pre->next 会出错。这属于没有考虑边界情况
删除头节点时,并未考虑边界问题。
看不懂c++, 浅浅打个卡(●’◡’●)
边界问题,第一个循环结束后fast为null,fast.next报错
存在删除头结点的问题,必须要建立虚拟节点;
存在n>链表长度的问题,第一个while循环需要对fast进行约束;
问题出在当fast为空,while下面代码不执行,然而pre已经是空指针最后解决方案如下
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(headnullptr||head->nextnullptr) return nullptr;
ListNode* fast = head, slow = head;
while(n–){
fast = fast->next;
}
ListNode pre = nullptr;
while(fast){
pre = slow;
fast = fast->next;
slow = slow->next;
}
if (pre nullptr) { // 处理删除头节点的情况
ListNode* temp = head;
head = head->next;
delete temp;
} else {
pre->next = slow->next;
delete slow;
}
return head;
}
};
需要设立dummy虚拟头结点
没有考虑
head->next == nullptr的情况这个界面让我身临其境的感觉到窒息,回头结合自己之前做的删除倒数节点的题来看。我原本是使用虚拟头节点进行解决的,后面想偷懒试试能不能不要头节点,但突然发现这样会出现边界的问题。
这个老哥的代码最致命的点也就是边界,当节点head[1],n=1的情况下,fast节点会出现空指针异常。
1.判断是否为头结点的问题
2.如果n为特殊值,超出范围时fast会报错
当输出第一个节点的时候,程序会报错。需要利用虚拟头节点来避免讨论。
看不懂c++啊啊
边界问题:1.头节点为NULL应该返回NULL 2. 倒数节点数k比链表节点多的情况 3. 需要删除的是倒数第一个节点的问题
是不是应该考虑一下边界条件,第一个循环直接让fast为空指针了。
当fast为空,第二个while进不去,pre是空指针,无法使用
不应该是n–,应该是以n-1为fast的快于slow的步数