List<T>的RemoveAt方法未按指定索引删除,误删末尾元素求助
问题分析与修正
首先,你遇到的RemoveAt删错元素的核心原因是传参错误——在第二个条件分支里,你把元素值input[i + 1]当成了索引传给RemoveAt,而RemoveAt需要的是要删除元素的位置索引。比如如果input[i+1]的值刚好等于列表最后一个元素的索引(比如列表长度是3,元素值是2),就会误删最后一个元素。
除此之外,你的代码还有几个潜在问题:
- 直接访问
input[i + 2]没有做边界检查,会触发索引越界异常 - 正向循环中频繁修改
i的值(i--),结合列表元素的动态变化,很容易导致逻辑混乱,出现重复处理或遗漏元素的情况
修正后的实现思路
处理这种需要修改列表结构的场景,从后往前遍历会更安全——因为删除后面的元素不会影响前面未遍历元素的索引位置,避免了索引混乱的问题。我们可以这样实现相邻相等元素的求和合并:
private static int GetNumberFromInput(List<int> input) { // 从倒数第二个元素开始往前遍历,确保i+1始终是有效索引 for (int i = input.Count - 2; i >= 0; i--) { // 检查当前元素和下一个元素是否相等 if (input[i] == input[i + 1]) { int sum = input[i] + input[i + 1]; // 删除下一个元素(传入正确的索引i+1) input.RemoveAt(i + 1); // 将当前元素替换为求和结果 input[i] = sum; } } // 根据需求返回结果:这里返回最终列表的最后一个元素,空列表则返回0 return input.Count > 0 ? input[input.Count - 1] : 0; }
关键说明
- 反向遍历:从
input.Count - 2开始,天然避免了i+1越界的问题,无需额外的边界判断 - 正确使用RemoveAt:明确传入要删除元素的索引
i+1,彻底解决删错元素的问题 - 简化逻辑:去掉了冗余的条件判断,只专注于相邻相等元素的合并,代码更易读和维护
如果你原本的需求是处理非相邻的相等元素,或者有其他特殊逻辑,可以再补充说明,我再帮你调整~
内容的提问来源于stack exchange,提问作者Nikolai Stoilkov
相关产品推荐
相关产品推荐

