You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除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:

  1. 第一个34在索引3,满足条件被删除;
  2. 原本索引4的34会前移到索引3;
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:37:28