数据结构--remove方法对LinkedList类的使用注意

来源:互联网 发布:北大青鸟网络课程介绍 编辑:程序博客网 时间:2024/05/18 06:15

直接上代码:

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;    }    }


0 0
原创粉丝点击