移除有序链表重复元素时代码触发段错误如何解决?
段错误原因分析
你的代码在特定测试用例下触发段错误,核心是3处未做边界校验的空指针解引用,同时还存在内存泄漏问题,具体问题点如下:
- 未处理空链表场景:
removeDuplicates函数初始直接访问curr->next,如果传入的head本身是空指针(空链表),第一行循环判断就会解引用空指针触发崩溃。 remove函数循环无边界校验:循环判断条件curr->data==curr->next->data没有提前判断curr->next是否为空。如果链表尾部存在连续重复节点,curr指针一路后移到最后一个节点时,curr->next为NULL,此时访问curr->next->data直接触发空指针错误。- 未处理删除后到达链表尾部的场景:如果整个链表所有节点值都重复,
remove函数执行完会返回NULL,赋值给curr后,下一轮循环判断curr->next时再次解引用空指针崩溃。 - 附带内存泄漏问题:连续重复的中间节点没有被释放,只删除了最后一个重复节点,会产生野指针和内存泄漏。
修正后的代码
Node *remove(Node *curr){ int duplicateVal = curr->data; // 先判断next非空再访问next的成员,逐个删除后续重复节点 while(curr->next != NULL && curr->next->data == duplicateVal){ Node *delNode = curr->next; curr->next = delNode->next; delete delNode; } return curr->next; } // 有序链表去重函数 Node *removeDuplicates(Node *head) { // 空链表直接返回 if(head == NULL){ return NULL; } Node *curr = head; // 每次循环先判断curr非空,再访问curr->next while(curr != NULL && curr->next != NULL){ if(curr->data == curr->next->data){ curr->next = remove(curr); } else{ curr = curr->next; } } return head; }
修正核心逻辑:所有访问指针成员的场景,都先校验指针非空;删除连续重复节点时逐个释放后续重复节点,既避免内存泄漏,也不需要额外移动当前节点指针,从根源上减少空指针触发风险。
内容的提问来源于stack exchange,提问作者SAUMYA PANDEY
相关产品推荐
相关产品推荐

