单链表去重函数在尾部重复元素测试用例中报错,求排查
单链表去重函数错误排查
你的removeDuplicates函数在处理尾部重复元素时出错,主要有两个核心问题:
- 删除节点后错误地移动temp指针:每次删除重复节点后,你立即将
temp移到下一个节点,导致跳过了对新的temp->next节点的检查(该节点可能仍是当前curr的重复项)。例如链表2->2->2中,删除第二个2后,temp直接跳到第三个2,无法再检查它是否与第一个2重复。 - 冗余的空指针检查:内层循环的
temp!=NULL判断是多余的,因为内层循环条件temp->next!=NULL已经保证了temp不为空。
修复后的代码
SinglyLinkedListNode* removeDuplicates(SinglyLinkedListNode* llist) { if(llist == NULL) return NULL; SinglyLinkedListNode* curr = llist; // 修改外层循环条件,确保处理所有节点(即使是最后一个) while(curr != NULL) { SinglyLinkedListNode* temp = curr; while(temp->next != NULL) { // 移除冗余的temp!=NULL检查 if(temp->next->data == curr->data) { SinglyLinkedListNode* nodetodelete = temp->next; temp->next = temp->next->next; delete(nodetodelete); // 删除节点后不移动temp,继续检查新的next节点 } else { // 仅当未删除节点时才移动temp temp = temp->next; } } curr = curr->next; } return llist; }
关键修复点说明
- 调整temp指针的移动逻辑:只有当未删除节点时才将
temp向后移动,删除节点后保持temp不动,以便检查新的temp->next是否仍为重复项。 - 简化外层循环条件:将
curr!=NULL && curr->next!=NULL改为curr!=NULL,确保遍历所有节点(即使是最后一个,此时内层循环不会执行,无副作用)。 - 移除冗余检查:删除
temp!=NULL判断,优化代码逻辑。
内容的提问来源于stack exchange,提问作者mohit_kumar_2504
相关产品推荐
相关产品推荐

