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

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

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

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

共以下 50 个回答

  • 招舟子 普通 2023年8月24日 下午10:52

    没考虑好只有一个节点

    0 赞同 0 条回复
  • WhyNot 普通 2023年7月19日 下午4:06

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

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年7月19日 上午12:18

    没考虑删除头节点
    没考虑n大于链表长度的情况,第一个while需要加判断fast为空

    0 赞同 0 条回复
  • Ming 普通 2023年7月5日 上午10:17

    没有考虑删除的是头结点的情况,建议增删改类的链表题都建立虚拟头结点好一致对待

    0 赞同 0 条回复
  • 淡色 花樱 普通 2023年7月4日 上午12:18

    头结点问题,第一个结点就是目标结点的情况,要么就创建一个虚拟头节点来统一处理删除头节点和非头节点的情况
    空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针

    0 赞同 0 条回复
  • Gracelyne 普通 2023年7月3日 上午11:58

    没有单独考虑一个节点或者删除头结点的情况,可以加一个判断if(cur->next nullptr) return nullptr;

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年6月29日 下午2:11

    1.要判断while循环时,fast->next指针可能为空的情况,这时候可能给出的n大于链表的长度
    2.链表只有一个节点时,pre是空指针异常,n=1时也没能删除链表中的节点,可以加一个判断(head->next NULL && n 1) || head NULL,返回NULL

    0 赞同 0 条回复
  • Sexypig. 普通 2023年6月28日 下午11:06

    很明显,没有考虑仅含一个节点的情况。若仅含一个节点,第一个while循环结束时fast已经到达null,不会进入第二个循环,这时pre指针仍为npt,不存在next。

    0 赞同 0 条回复
  • 泡芙 永久会员 2023年6月27日 下午9:54
    1. 没有单独考虑删除的节点是头节点的情况,要么就创建一个虚拟头节点来统一处理删除头节点和非头节点的情况
    2. while循环那里,当fast != null 的时候的 fast 和 slow 同时往前走,当 fast = = null时停止循环,也就是slow已经走到被删除的节点位置了
    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年6月26日 下午2:11

    打卡,综合视频和评论区,发现主要有以下问题:
    1.快指针前进n步时没有考虑fast为null的情况;
    2.没有考虑删除的节点是头节点的情况。

    0 赞同 0 条回复
  •  普通 2023年6月25日 上午10:21

    没考虑删除头节点

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年6月24日 下午10:44

    没考虑n大于链表长度的情况

    0 赞同 0 条回复
  • BOZ 普通 2023年6月24日 下午10:11

    没考虑待删节点是头节点的情况,可能导致空指针引用异常

    0 赞同 0 条回复
  • 未来已来~ 普通 2023年6月24日 下午8:12

    结合评论道友们的评论来看,让自己养成好习惯,先对特殊情况进行判断,比如头结点问题(判断是否只有一个结点)和空指针问题(判断是否为空指针并处理),以及遇到删除结点时可以先创建一个虚拟结点辅助.

    0 赞同 0 条回复
  • 3_🔥 永久会员 2023年6月23日 下午9:50

    没考虑删除头节点

    0 赞同 0 条回复
  • Yodl. 普通 2023年6月23日 下午12:57

    头结点问题,第一个结点就是目标结点的情况
    空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针

    1 赞同 0 条回复
  • 彦,,# 普通 2023年6月22日 下午11:54

    边界问题,fast的next得判断空,还有删除头节点的时候有问题。

    0 赞同 0 条回复
  • 跋扈疙瘩汤 普通 2023年6月22日 下午10:32

    头节点

    0 赞同 0 条回复
  • CV大神 普通 2023年6月22日 下午10:30

    遇到删除节点的,最好构造虚拟节点,否则如果删的是头结点,不好处理

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年6月22日 下午7:53

    删除节点依赖前驱节点进行删除,删除头结点时没有前驱节点,解决方案是创建哑节点指向头结点

    1 赞同 0 条回复
  • WhyBeBubble 普通 2023年6月22日 下午5:46

    没考虑删除头节点

    0 赞同 0 条回复
  • 别恰冰水🧊 永久会员 2023年6月21日 下午11:19

    删除头节点时的边界问题,需要建立虚拟头节点

    0 赞同 0 条回复
  • 局外人 普通 2023年6月21日 下午10:19

    未能考虑目标节点为第一个头节点的情况

    0 赞同 0 条回复
  • peach 普通 2023年6月21日 下午5:25
    • 给出一下自己的代码
     //删除链表的倒数第n个节点
    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode vn = new ListNode(-1,head); //设置虚拟头节点
            ListNode f = vn;
            ListNode s = vn;
            while(n-- > 0){
                f = f.next; //快指针先走n步
            }
            while(f.next != null){ //一起走,快指针走到最后一个节点,慢指针走到要删除的前一个节点
                f = f.next;
                s = s.next;
            }
            s.next = s.next.next;
            return vn.next; //返回虚拟头节点的下一个节点
        }
    }
    
    2 赞同 1 条回复
    • 彦,,# 普通 @ peach 2023年6月22日 下午11:52

      这个fast指针next的时候是不是得判断空,还有问下设置虚拟头节点有什么好处啊?是防止删除头节点?

  • 断舍离 永久会员 2023年6月21日 下午4:04

    看不懂c++哇,但感觉头节点好像是没判断

    0 赞同 0 条回复
  • 小吕 普通 2023年6月21日 下午2:42

    c++判断边界应该判断为while(fast->next!=NULL)

    0 赞同 0 条回复
  • 张开怀 普通 2023年6月21日 上午10:53

    头结点问题,第一个结点就是目标结点的情况
    空指针问题,若fast->next为空指针,再让其指向下一个结点会报错,第一个while循环需要加判断条件:fast是否为空指针

    1 赞同 0 条回复
  • 悠若 普通 2023年6月21日 上午10:50

    没有考虑删除头节点时的边界问题

    0 赞同 0 条回复
  • Bello~ 普通 2023年6月21日 上午10:04

    当n等于链表长度,以上代码会出现空指针。只需要在第二个while(fast) 前加个if(fast) return head->next;即可

    0 赞同 0 条回复
  • 哈哈哈哈开开心心 普通 2023年6月21日 上午9:49

    删除头节点出现问题 可建造虚拟节点使其next 初始为head

    0 赞同 0 条回复
  • 花老爷 普通 2023年6月21日 上午9:45

    当要删除头节点时,此时pre是空的,pre->next会报错。

    0 赞同 0 条回复
  •          普通 2023年6月21日 上午3:25

    n=1报错

    0 赞同 0 条回复
  • 大鑫啊 普通 2023年6月21日 上午1:12

    在遇到可能删除头结点的问题时,使用虚拟节点,这样不会导致删除时出现null指向next

    0 赞同 0 条回复
  • 硬核洋葱 普通 2023年6月20日 下午11:29

    此题可能删除第一个节点,这样 pre->next 会出错。这属于没有考虑边界情况

    0 赞同 0 条回复
  • 怀瑾 永久会员 2023年6月20日 下午11:12

    删除头节点时,并未考虑边界问题。

    0 赞同 0 条回复
  • 张君雅小妹妹 普通 2023年6月20日 下午10:39

    看不懂c++, 浅浅打个卡(●’◡’●)

    0 赞同 0 条回复
  • 阿白 普通 2023年6月20日 下午10:39

    边界问题,第一个循环结束后fast为null,fast.next报错

    0 赞同 0 条回复
  • désire. 普通 2023年6月20日 下午10:36

    存在删除头结点的问题,必须要建立虚拟节点;
    存在n>链表长度的问题,第一个while循环需要对fast进行约束;

    0 赞同 0 条回复
  • ~ 普通 2023年6月20日 下午10:31

    问题出在当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;
    }
    };

    0 赞同 0 条回复
  • yxy 普通 2023年6月20日 下午10:23

    需要设立dummy虚拟头结点

    0 赞同 0 条回复
  • 江畅 普通 2023年6月20日 下午10:20

    没有考虑 head->next == nullptr 的情况

    // https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* res{0};
    
            ListNode* dummyHead = new ListNode{0};
            dummyHead->next = head;
    
            ListNode* fast = dummyHead;
            ListNode* slow = dummyHead;
    
            // fast 指针先走 n 步
            while (n) {
                fast = fast->next;
                --n;
            }
    
            // slow, fast 走相同步数
            // 直到 fast 到链表尾
            // 此时 slow 下一节点即为待删节点
            while (fast->next != nullptr) {
                fast = fast->next;
                slow = slow->next;
            }
    
            slow->next = slow->next->next;
            res = dummyHead->next;
            delete dummyHead;
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 哈哈哈 普通 2023年6月20日 下午10:15

    这个界面让我身临其境的感觉到窒息,回头结合自己之前做的删除倒数节点的题来看。我原本是使用虚拟头节点进行解决的,后面想偷懒试试能不能不要头节点,但突然发现这样会出现边界的问题。
    这个老哥的代码最致命的点也就是边界,当节点head[1],n=1的情况下,fast节点会出现空指针异常。

    0 赞同 0 条回复
  • jhfuture 普通 2023年6月20日 下午10:07

    1.判断是否为头结点的问题
    2.如果n为特殊值,超出范围时fast会报错

    0 赞同 0 条回复
  • Vow the vow。 普通 2023年6月20日 下午9:49

    当输出第一个节点的时候,程序会报错。需要利用虚拟头节点来避免讨论。

    0 赞同 0 条回复
  • 伏月三十 普通 2023年6月20日 下午9:16

    看不懂c++啊啊

    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年6月20日 下午9:06
    //错误:没有判断边界
    //比如说,有3个结点,要删除倒数第3个结点,也就是n=3
    //执行完第一个循环后,fast指向空,说明要删除的就是头结点,此时直接返回head.next即可
    
    0 赞同 0 条回复
  • 行动派小彩笔 普通 2023年6月20日 下午8:52

    边界问题:1.头节点为NULL应该返回NULL 2. 倒数节点数k比链表节点多的情况 3. 需要删除的是倒数第一个节点的问题

    ListNode* deleteNode(ListNode* head,int k)
    {
        if(head == NULL) return NULL; // 头节点判空
        ListNode* last = head;
        for(int i = 0;inext; // 防止k大于链表长度
            else return NULL;// 如果k大于链表长度,return NULL
        }
        ListNode* cur = head;
        while(last!=NULL) //当last为NULL的时候,cur 指向被删除节点
        {
            if(k==1&&cur->next->next==NULL) // 如果需要删除的是最后一个节点,进行特殊处理
            {
                cur->next = NULL;
                return head; //删除完直接return
            } 
            else//非最后一个节点,找到需要删除的节点
            {
                last = last->next;
                cur = cur->next;
            }
         cur->val = cur->next->val;
         cur->next = cur->next->next;
    return head;
    }
    
    1 赞同 0 条回复
  • mpweixin用户 普通 2023年6月20日 下午8:29

    是不是应该考虑一下边界条件,第一个循环直接让fast为空指针了。

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年6月20日 下午6:37

    当fast为空,第二个while进不去,pre是空指针,无法使用

    0 赞同 0 条回复
  • mpweixin用户 普通 2023年6月20日 下午4:26

    不应该是n–,应该是以n-1为fast的快于slow的步数

    0 赞同 0 条回复

# 回答此问题

后才能回答