Java自定义链表:如何实现条件迭代且删除同步至原链表?
解决方案:实现过滤式迭代器(Filtering Iterator)
原代码的核心问题:临时修改原链表再恢复的操作完全无效,最终返回的迭代器仍会遍历原链表所有元素,根本没实现过滤逻辑,还引入了不必要的链表修改开销。
正确的思路是包装原迭代器,实现一个只返回符合条件元素的过滤迭代器,同时让删除操作直接委托给原迭代器,这样就能同步修改原链表。
具体实现步骤
1. 自定义FilteringMyIterator类
这个类组合原MyIterator,在遍历过程中跳过不符合条件的元素,删除操作直接复用原迭代器的逻辑(确保删除的是原链表中的对应元素):
public class FilteringMyIterator<Y> implements MyIterator<Y> { private final MyIterator<Y> originalIterator; private final X conditionChecker; private Y nextValidElement; // 缓存下一个符合条件的元素,避免重复遍历 public FilteringMyIterator(MyIterator<Y> originalIterator, X conditionChecker) { this.originalIterator = originalIterator; this.conditionChecker = conditionChecker; this.nextValidElement = findNextValid(); } // 查找下一个符合条件的元素 private Y findNextValid() { while (originalIterator.hasNext()) { Y element = originalIterator.next(); if (conditionChecker.satisfies(element)) { return element; } } return null; } @Override public boolean hasNext() { return nextValidElement != null; } @Override public Y next() { if (!hasNext()) { throw new NoSuchElementException(); } Y current = nextValidElement; nextValidElement = findNextValid(); // 提前查找下一个符合条件的元素 return current; } @Override public void remove() { // 调用原迭代器的remove方法,删除最后一次next()返回的元素(原链表中的对应节点) originalIterator.remove(); } }
2. 修改原链表的iterator(X x)方法
直接返回包装后的过滤迭代器,无需修改原链表结构:
public MyIterator<Y> iterator(X x) { return new FilteringMyIterator<>(this.iterator(), x); }
原理说明
- 过滤逻辑:通过
findNextValid()方法提前遍历原迭代器,跳过不符合条件的元素,只缓存符合条件的元素供next()返回。 - 同步删除:
remove()方法直接调用原迭代器的remove(),因为原迭代器的remove()操作的是原链表的节点,所以删除动作会同步反映到原链表中。 - 无额外链表修改:整个过程不需要创建临时链表或修改原链表结构,避免了原代码中的无效操作和性能开销。
内容的提问来源于stack exchange,提问作者Lee_Haney
相关产品推荐
相关产品推荐

