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

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

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

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

参考答案:没有考虑空指针问题,如果删除的是第一个节点,也就是头节点,那么会出现异常。因为在第一个 while循环之后,fast 为 null,这样就无法进去第二个while循环,此时 pre 就一直为 null,最后调用 pre.next 就会出问题。

共以下 26 个回答

  • 树懒在橘子洲数星星 普通 2024年11月28日 下午2:46

    要考虑删除头节点

    0 赞同 0 条回复
  • yelinliner 普通 2024年11月27日 下午4:07

    需要考虑空指针的问题,如果删除的是头节点就会出现异常;另外在面试时,如果面试官问哪一步还有没有问题,有可能是面试官在给提示,一定要多想一想

    0 赞同 0 条回复
  • 陆狗陆狗 普通 2024年11月26日 下午10:54

    需要考虑删除头节点的情况

    0 赞同 0 条回复
  • 岱 永久会员 2024年11月26日 下午9:43

    没有考虑到删除头节点的情况

    0 赞同 0 条回复
  • hjx 普通 2024年11月26日 下午8:17

    需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点

    0 赞同 0 条回复
  • Rad 普通 2024年11月26日 下午2:57

    需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点

    0 赞同 0 条回复
  • 生活在经验里 普通 2024年11月25日 上午11:47

    需要考虑删除头节点的情况,可以首先判断倒数第n的节点是不是头节点

    0 赞同 0 条回复
  • 无言 永久会员 2024年11月24日 下午2:13

    没有考虑删除头节点的情况

    0 赞同 0 条回复
  • 🍊 普通 2024年11月23日 下午6:23

    没有考虑头节点

    0 赞同 0 条回复
  • 月下足迹 普通 2024年11月23日 下午2:41

    没有考虑删除头结点的情况

    0 赞同 0 条回复
  • Pendulumpal 普通 2024年11月23日 下午1:11

    第一个while循环,有可能删除到第一个节点,导致为空

    0 赞同 0 条回复
  • Kisara 普通 2024年11月23日 上午10:58

    如果是要删除头结点,第一个循环结束后fast已经为空了,可以设置一个辅助头节点,slow=dum fast=head;这样最后停下时,slow正好是要删除的前一个节点,也不用再声明变量pre

    0 赞同 0 条回复
  • youngsir 普通 2024年11月23日 上午8:41

    第一个while循环,当sz=n的时候,fast->next就为空了

    0 赞同 0 条回复
  • 越努力越幸运 普通 2024年11月23日 上午1:11

    没有考虑空指针的特殊情况

    0 赞同 0 条回复
  • Poetry and distance 永久会员 2024年11月23日 上午12:39
    问题:
    1.由于倒数删除的节点数量小于节点长度,可能导致fast.next的时候空指针
    2.删除头节点会导致下面的 pre.next空指针问题,所以需要单独判断删除头节点的时候直接删除
    
    0 赞同 0 条回复
  • mpweixin用户 普通 2024年11月22日 下午10:31

    循环时直接在fast上进行了操作,出循环后没有重新赋值,一直是空指针,后续的代码也没有处理空指针的临界情况。

    0 赞同 0 条回复
  • 黑键〰 普通 2024年11月22日 下午5:18

    看了下视频和大家的题解,就是边界情况的处理问题。n=sz的时候,fast快指针已经跑到链表最后一个的next了,所以是null,没办法进入第二个while循环,所以pre也还是初始值null,并没有被赋成slow

    0 赞同 0 条回复
  • Renasc 普通 2024年11月22日 下午4:04

    没有考虑删除头结点的情况

    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            // 如果head为null,直接返回
            if (head == null) {
                return head;
            }
    
            // 设置虚拟头结点
            ListNode dummy = new ListNode(0);
            dummy.next = head;
    
            // 设置快指针为head,慢指针为dummy
            ListNode fast = dummy.next;
            ListNode slow = dummy;
    
            // 先让fast走n步
            for (int i=0; i<n; i++) {
                fast = fast.next;
            }
    
            // 再让fast为空时,slow就指向了倒数第n-1个节点
            while (fast != null) {
                fast = fast.next;
                slow = slow.next;
            }
    
            // 删除倒数第n个节点
            slow.next = slow.next.next;
    
            // 返回头结点
            return dummy.next;
        }
    }
    
    0 赞同 0 条回复
  • jaron 普通 2024年11月22日 上午10:23

    没有考虑删除头结点的情况,此时调用pre.next会出现空指针异常。可以考虑使用辅助头结点,修改如下:

    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode dummy = new ListNode(0, head);
            ListNode fast = head;
            // slow 指向辅助头结点
            ListNode slow = dummy;
            for (int i = 0; i < n; i++) {
                if (fast == null)
                    return null;
                fast = fast.next;
            }
            while (fast != null) {
                fast = fast.next;
                slow = slow.next;
            }
            // slow 此时是要删除节点的前一个节点
            slow.next = slow.next.next;
            return dummy.next;
        }
    }
    
    0 赞同 0 条回复
  • Xiang. 永久会员 2024年11月22日 上午9:46

    空指针问题:由于sz>=n,所以唯一的空指针情况就可能出在,szn时,所以只需要加一个删除首节点(倒数第sz个节点)情况的处理就可以了。

    0 赞同 0 条回复
  • Tom Yuan 普通 2024年11月22日 上午4:08

    n = sz 时,第一个while最后会跑到头,而此时fast.next已经是null了,赋值给fast
    第二个while会被直接跳过。

    0 赞同 0 条回复
  • Jerry 普通 2024年11月21日 下午10:29

    错误:在快指针fast前进时需要判断是否为null。
    若fast前进过程时为null,说明n>=sz。题目约束了n<=sz。
    所以n=sz,说明要删除的是头节点,此时应该直接return head->next;

    0 赞同 0 条回复
  • 张君雅小妹妹 普通 2024年11月21日 下午10:22

    没有考虑需要删除头节点的情况,最好定义一个前置节点指向头节点

    0 赞同 0 条回复
  • 迢迢星野 普通 2024年11月21日 下午9:43

    ① 头节点的删除需要额外判断
    ② 题目要求 0 <= n<= sz,说明 cnt 的取值一定在链表内,因此在第一个 while 循环内移动 fast 指针的过程中,当 fast == null 时,while 循环一定也结束了。也就是说 fast 可以走完 n 步,但是当 fast == null 时,第二个循环无法进入,pre 依旧是 nullptr,那么最后的 pre->next 就会出错。

    0 赞同 0 条回复
  • lQl 永久会员 2024年11月21日 下午9:34

    没考虑删的是第一个节点的情况

    0 赞同 0 条回复
  • mpweixin用户 普通 2024年11月21日 下午9:27

    1.在开头没有进行防御性编程,没有考虑Head为nullptr的情况;2.在fast走前k步时没有考虑无法走完前k步的情况。

    0 赞同 0 条回复

# 回答此问题

后才能回答