直接上代码:
package com.itany.linkedList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Test
{
/*
* remove方法对LinkedList类的使用注意
* 将表中所有值为偶数的项删除
*/
public static void main(String[] args)
{
List<Integer> lst=new LinkedList<Integer>();
lst.add(10);
lst.add(12);
lst.add(4);
lst.add(45);
lst.add(3);
List<Integer> ls=remove3(lst);
System.out.println(ls);
}
//方法一:此方法对所有类型的表都是二次的
//对于ArrayList remove是低效率 程序花费的是二次时间
//对于LinkedList 有两个问题 其一是get的效率低,也花费二次时间;其二是remove效率低 因为达到位置i的代价也是高的(链表顺序也是用i来排序的,只是不连续存储而已)
//LinkedList对于已知位置的remove是很快的
public static List remove1(List<Integer> lst)
{
int i=0;
while(i<lst.size())
{
if(lst.get(i)%2==0)
{
lst.remove(i);
}
else
i++;
}
return lst;
}
//方法二:这次不用get 而是使用迭代器(使用增强for循环间接使用) 一次完成所有
//但是问题1 使用Collection接口的remove方法时,必须再次搜索该项,花费线性时间
//问题2 情况更严重,在运行时会报异常,当使用Collection接口的remove方法时,对于增强for循环使用的基础迭代器是非法的(不能你一边删除我同时迭代)
public static List remove2(List<Integer> lst)
{
for (Integer integer : lst)
{
if(integer%2==0)
{
lst.remove(integer);
}
}
return lst;
}
//方法三:为了解决删除的问题 我们使用迭代器的删除 避免集合在删除的时候迭代 直接全部由迭代器操作
//注意:!!!在迭代器iterator中删除之后,原来集合中的对应内容也相应改变 因为这个迭代器也是有该集合产生的
public static List remove3(List<Integer> lst)
{
Iterator<Integer> it=lst.iterator();
while(it.hasNext())
{
if(it.next()%2==0)
{
it.remove();
}
}
return lst;
}
}