有序链表去重代码问题:首个重复元素未正确移除求助
有序链表重复节点删除问题解决
我来帮你搞定这个问题——看你的描述,输入1->1->2->2->3->3后返回了1->1->2->3,明显是头节点的重复对没处理好,你的代码踩了两个常见的小坑,咱们一步步梳理:
问题出在哪?
从你给出的代码片段来看,核心问题有两个:
- 初始化逻辑错误:你写了
Node* Current = &head;,如果head是链表头指针(通常是Node*类型),这会让Current变成「指向指针的指针」,后续访问Current->next的逻辑完全混乱,直接导致头节点的重复判断失效。 - 变量名拼写失误:你代码里的
Current->next->info == Cur...明显是没写完(应该是Current->info),这会让内层循环的判断条件不成立,根本不会触发重复节点的删除,所以头两个1就被保留下来了。
另外,如果你的函数参数是Node head(值传递),还会导致链表头的修改无法同步到外部,这也是容易忽略的坑。
修正后的可运行代码
下面是帮你调整好的代码,加了详细注释,直接就能用:
// 用指针的引用做参数,确保外部能拿到修改后的链表头 void removeDuplicates(Node* &head) { // 空链表或只有一个节点,直接返回 if (head == nullptr || head->next == nullptr) { return; } Node* current = head; while (current != nullptr && current->next != nullptr) { // 发现当前节点和下一个节点值重复 if (current->info == current->next->info) { Node* duplicate = current->next; // 遍历删除所有和当前节点值相同的后续节点 while (duplicate != nullptr && duplicate->info == current->info) { Node* temp = duplicate; duplicate = duplicate->next; delete temp; // 记得释放内存,避免泄漏 } // 把当前节点的next指向第一个不重复的节点 current->next = duplicate; } else { // 值不重复,直接移动到下一个节点 current = current->next; } } }
代码逻辑说明
- 指针引用参数:
Node* &head这个写法很关键,能确保我们在函数里修改链表结构(比如头节点本身需要调整的场景)时,外部调用方能同步拿到修改后的结果。 - 批量删除重复节点:内层循环会一次性把所有连续的重复节点都删掉,比如遇到
1->1->1会直接处理成1,效率更高。 - 内存安全:每次删除节点后用
delete释放内存,避免内存泄漏问题。
用这个代码测试你的输入1->1->2->2->3->3,就能得到预期的1->2->3了。
更简洁的实现思路
如果你喜欢更紧凑的代码,也可以用这个版本,逻辑本质一样:
void removeDuplicates(Node* &head) { Node* current = head; while (current != nullptr) { Node* next_node = current->next; // 删掉所有和current值相同的后续节点 while (next_node != nullptr && next_node->info == current->info) { Node* temp = next_node; next_node = next_node->next; delete temp; } current->next = next_node; current = next_node; } }
内容的提问来源于stack exchange,提问作者Aaron Imani
相关产品推荐
相关产品推荐

