删除LinkedList中大于25的节点时代码未删除全部目标节点的问题
为什么删除LinkedList中大于25的节点后仍有34残留?
问题描述
我需要完成以下任务:从用户输入1-50范围内的数字创建LinkedList,然后删除所有值大于25的节点。我基于自带add(int value)、get(int index)和remove(int index)方法的LinkedList类实现了逻辑,但运行后发现有不符合条件的节点残留。
输入的数字为:[23, 45, 12, 34, 34, 66, 25, 13, 12, 24, 33],输出结果为[23, 12, 34, 25, 13, 12, 24],其中仍存在大于25的34。
我的代码如下:
import java.util.*; public class q1 { public static void main(String[] args) { LinkedList list = new LinkedList<Integer>(); Scanner sc = new Scanner(System.in); for (int i = 0; i <= 10; i++) { list.add(i, sc.nextInt()); } System.out.println(list); for (int i = 0; i < list.size(); i++) { if ((int) list.get(i) > 25) { list.remove(i); } } System.out.println(list); } }
问题原因
问题出在正序遍历删除节点时的索引偏移:
当你删除索引i的节点后,LinkedList中该节点后面的所有元素都会向前移动一位(索引减1)。但你的循环中i会继续递增,导致跳过了原本位于i+1位置、现在移到i位置的节点。
比如输入中的两个连续34:
- 第一个34在索引3,满足条件被删除;
- 原本索引4的34会前移到索引3;
- 此时
i递增到4,直接检查索引4的元素,跳过了新的索引3的34,导致它被保留。
解决方案
提供三种可行的修复方式:
方式一:倒序遍历
从链表最后一个元素往前遍历,删除节点不会影响前面未遍历的元素索引:
for (int i = list.size() - 1; i >= 0; i--) { if ((int) list.get(i) > 25) { list.remove(i); } }
方式二:使用迭代器(推荐)
LinkedList的迭代器支持安全删除操作,避免索引偏移问题:
Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer num = iterator.next(); if (num > 25) { iterator.remove(); } }
方式三:删除节点后回退索引
删除节点后将i减1,抵消循环中i++的影响,确保下一次循环能检查到前移的元素:
for (int i = 0; i < list.size(); i++) { if ((int) list.get(i) > 25) { list.remove(i); i--; // 回退索引,避免跳过下一个节点 } }
内容的提问来源于stack exchange,提问作者Diya Saraf
相关产品推荐
相关产品推荐

