【真实面试】找错误:面试某大厂手写链表题,找找他错在哪里了?

本问题对应课程链接:剑指offer刷题第四期

这是一个读者面试某大厂时,在线写 删除链表倒数第 n 个节点的算法题,不过我说过,链表题很容易出错,他也是犯了致命错误。

现在考验一下大家,大家看看他的代码错在哪里?
打卡:找出他哪里错了

共以下 36 个回答

  • 望仔 普通 2023年7月26日 下午8:37

    在第一个循环中应判断fast的Next是否为空

    0 赞同 0 条回复
  • 始料未及 普通 2023年7月20日 下午3:53

    第一个循环之后,fast可能为空,不会进入第二个循环,直接导致pre.next空指针

    0 赞同 0 条回复
  • Edenms-u 普通 2023年7月17日 下午10:12

    第一个while循环结束可能存在链表szn的情况,此时fast指向空,第二个while循环条件为假,pre为空,进行操作会导致程序挂死

    0 赞同 0 条回复
  • Marshan 普通 2023年7月11日 下午8:00

    没有对fast为空进行判断

    0 赞同 0 条回复
  • NullPointerException 普通 2023年7月11日 下午7:21

    1.fast会空,但不是主要问题,因为题目限定了1<=n<=sz,最差情况 n=sz,fast此时为null,不会进入第二循环
    2.问题在于,当n=sz时,返回结果有问题,没进入第二个删除循环,应该定义一个result节点,result.next=head
    最后 return result.next

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月10日 下午11:17

    第一个while循环要对fast是否为空进行判断

    0 赞同 0 条回复
  • 周小二 普通 2023年7月10日 下午10:58

    fast.next为空时,不会进入第二个循环,pre为空,无法删除

    0 赞同 0 条回复
  • doordie. 普通 2023年7月10日 下午6:54

    在第一个循环中应判断fast的Next是否为空

    0 赞同 0 条回复
  • 刹那芳间 普通 2023年7月10日 下午2:29

    在第一个循环中应判断fast的Next是否为空

    0 赞同 0 条回复
  • CKX 普通 2023年7月10日 上午12:21

    第二个while循环需进行fast为空判断

    0 赞同 0 条回复
  • ㅤ 普通 2023年7月9日 下午11:50

    少了fast判空处理

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月9日 下午10:33

    会空,如果只有一个节点 fast执行完指向的不是那个节点而是已经变成了空,进入不到第二个循环里面,

    0 赞同 0 条回复
  • Fighting boy😀 普通 2023年7月9日 下午9:31

    快指针先走K步,当输入为空链表时返回nullptr
    for(int i=0;i<k;i++){
    if(fastnullptr){
    return nullptr;
    }
    fast = fast->next;
    }

    0 赞同 0 条回复
  • 艺 普通 2023年7月9日 下午9:07

    第一个循环,fast可能会NULL,应该进行判断

    0 赞同 0 条回复
  • 神经蛙 普通 2023年7月9日 下午7:24

    当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead

    0 赞同 0 条回复
  • 神经蛙 普通 2023年7月9日 下午7:24

    当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead

    0 赞同 0 条回复
  • 神经蛙 普通 2023年7月9日 下午7:24

    当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead

    0 赞同 0 条回复
  • 神经蛙 普通 2023年7月9日 下午7:24

    当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead

    0 赞同 0 条回复
  • 神经蛙 普通 2023年7月9日 下午7:24

    当链表只有一个节点时,删除倒数第一个节点会出现null,应该要定义一个dummyHead,dummyHead.next = head, pre = dummyHead

    0 赞同 0 条回复
  • 3A87 普通 2023年7月9日 下午6:36

    如果要删除第一个结点的话,fast在第一个循环后会指向nullptr,第二个循环不会发生。

    0 赞同 0 条回复
  • Mooby 普通 2023年7月9日 下午6:29

    二

    0 赞同 0 条回复
  • 片言莫语 普通 2023年7月9日 下午5:30

    在第一个循环中应判断fast的Next是否为空

    0 赞同 0 条回复
  • 人生何处不青山 普通 2023年7月9日 下午5:27

    直接建立一个头节点不就得了吗?n的范围是 1<= n <= sz,建立个头节点,也不用第一个循环判断是不是为空了

    1 赞同 0 条回复
  • ppopp 普通 2023年7月9日 下午4:51

    判断边界条件,由于0 <= n <= sz, 如果n = 0, 直接返回head即可; 如果n = sz, 即删除首元节点, 此时fast在第一个循环会指向null,不会参与第二个循环,直接返回head->next即可。

    0 赞同 0 条回复
  • AD钙奶 普通 2023年7月9日 下午2:38

    在第一个循环,fast可能会走到null,那就意味着走不到第二个循环,那pre默认为null,pre->next 也就会报错了。
    例如第二个样例:循环出来的时候fast已经是null了,此时应该做一个判断 fast是否为null,如果是空的话,应该直接返回null。

    并且本题也说明了n是在sz以内的,所以上面的限制针对的是当n 等于节点总数的情况。也就是要删除的节点是头节点的情况。此时出循环后fast如果是null的话返回head.next就行了。

    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年7月9日 上午8:53

    在第一个循环中要判断fast是否为空

    0 赞同 0 条回复
  • 朱志刚 普通 2023年7月9日 上午12:17

    在fast先走n步后,要进行判断fast是否为NULL,如果是就直接返回NULL.

        while(n--)fast=fast->next;
        if(!fast)return NULL;
    
    0 赞同 0 条回复
  •  普通 2023年7月8日 下午11:30

    第一个循环判断时应判断Next是否为空

    0 赞同 0 条回复
  • #00456B 普通 2023年7月8日 下午11:26

    第二个测试样例就无法通过。因为就一个节点,还把这个节点删除了,那么在第二个循环中fast就为空了。不会进入第二个循环。这种题目感觉还是在最开始的时候设置虚拟头节点比较好,输出head就用dummy->next。
    如果不采用虚拟头节点的话。需要在第二个循环前面判断fast是否已经是空节点了。

    if(fast == NULL){
        return slow->next;
    }
    
    1 赞同 0 条回复
  • 北辰 普通 2023年7月8日 下午11:05

    需要判断fast是否为空

    0 赞同 0 条回复
  • 醒醒醒醒 普通 2023年7月8日 下午10:35

    在第一个循环fast指向的next中,需要进行判断是否为null,若是null,运行会报错

    0 赞同 0 条回复
  • 今天你刷题了嘛 普通 2023年7月8日 下午10:19

    删除的是head结点时,要进行判断,返回的是head.next

    0 赞同 0 条回复
  • 桎梏 普通 2023年7月8日 下午9:21

    删除的是第一个节点时,fast指针在第一个循环会指向null,此时不会进入第二个循环,运行报错。

    if(fast == null) return head.next
    
    0 赞同 0 条回复
  • 土豆芋泥包_ 普通 2023年7月8日 下午8:50

    如代码第二行需要判断当前fast是否为空,要不然空结点的next会报错

    for(int i=0;i<k;i++){
                if(fast==null){
                    return null;
                }
                fast = fast.next;
            }
    
    0 赞同 0 条回复
  • CaCO3 永久会员 2023年7月8日 下午8:44

    在第一个循环fast指向next中,要判断fast是否为空,才能继续,否则空结点nexr会直接报错

    0 赞同 0 条回复
  • 波雅汉库克 普通 2023年7月8日 下午2:57

    第一个循环的fast会空,如果n正好是linkedlist的长度,fast最后指空。在这种情况下,不会进入第二个while loop, 所以后面的prev->next = slow->next会直接报错。
    应该在两个loop之间做一个check? 如果为空就说明要删除的是头结点,做对应操作。

    0 赞同 0 条回复

# 回答此问题

后才能回答