C++链表去重代码遇末尾重复元素无输出问题求解
单链表重复元素移除代码无输出问题排查与修复
问题原因
- 外层循环逻辑存在空指针访问漏洞:原代码外层循环判断写为
while(ptr->next!=NULL && ptr!=NULL),C++中逻辑与&&为短路求值规则,会先执行左侧的ptr->next!=NULL判断。当链表所有元素重复(如测试用例1 1 1 1),第一轮内层循环删除完所有后续重复节点后,ptr会移动到NULL,下一轮循环直接访问ptr->next触发空指针异常,程序直接崩溃终止,因此不会输出后续结果。 - 边界处理缺失:当链表仅剩最后一个节点时,原判断逻辑的执行顺序也可能引发遍历异常。
修复方案
仅需调整removeDuplicates函数外层循环的判断顺序,利用短路求值规则先判断ptr是否为空,再访问其成员变量即可:
void removeDuplicates(Node* head){ Node *ptr,*ptr2,*temp; ptr=head; // 调整判断顺序,先判定ptr非空再访问ptr->next while(ptr != NULL && ptr->next != NULL){ ptr2=ptr; while(ptr2->next!=NULL){ if(ptr2->next->data==ptr->data){ temp=ptr2->next; ptr2->next=temp->next; temp->next=NULL; delete(temp); } else ptr2=ptr2->next; } ptr=ptr->next; } }
修复后可正常覆盖所有测试用例:
- 输入
1 1 1 1,输出结果为1 - 输入
2 1 1 2 1,输出结果为2 1 - 原有正常用例不受影响。
内容的提问来源于stack exchange,提问作者Geek。
相关产品推荐
相关产品推荐

