C语言链表moveOddItemsToBack功能节点顺序异常问题咨询
问题原因分析
- 核心逻辑错误:删除当前索引的奇数节点后,该位置后续的所有节点会整体前移一位,你的代码无论是否删除节点都统一执行
index++,会导致index和cur指针指向的节点实际索引错位,出现遍历遗漏、删错节点的问题,最终结果顺序错乱。 - 语法隐患:函数内未声明
index变量,若不存在全局定义的index会直接编译失败。
修复后的代码
void moveOddItemsToBack(LinkedList *ll) { ListNode *cur = ll-> head; int orgsize = ll->size; int index = 0; // 补全index的局部声明 // 空链表直接返回 if (cur == NULL) return; while (orgsize > 0){ // 当前节点为奇数 if (cur->item %2 !=0){ insertNode(ll, ll->size, cur->item); // 奇数追加到末尾 cur = cur -> next; removeNode(ll, index); // 删除原位置奇数 // 删除节点后index不递增,因为下一个待检查节点已经移到当前index位置 } // 当前节点为偶数 else{ cur = cur -> next; index++; // 只有未删除节点时才递增index } orgsize--; } }
验证说明
以输入链表1->2->3->4->5为例,修复后输出为2->4->1->3->5,偶数、奇数的相对顺序都和原始链表一致,符合功能要求。
内容的提问来源于stack exchange,提问作者user14436230
相关产品推荐
相关产品推荐

