2.ArrayList LinkedList之remove
2014-03-18 09:43
246 查看
remove操作,其实真实的开发中很少用到,可能是我经验尚少的缘故吧,我在开发中很少用到删除操作。
但是,虽然是一个很少用到的操作,其原理还是很值得大家学习的。
1.尾部删除
这种方式针对ArrayList和LinkedList 时间复杂度是一样的 都是常数时间
2.头部删除
这种方式针对ArrayList和LinkedList的时间复杂度是不同的
针对ArrayList
如果在头部删除元素,那么尾部元素会逐个向前移动一个位置,此时的时间复杂度是O(n)
针对LinkedList
此时在头部删除元素,只是将头部的下一个元素变成头部元素即可,原来的头部元素置为null(方便gc)。这样,时间复杂度是一个常数时间
3.中间位置删除
针对ArrayList,会将site()/2的元素向前移动一个位置,时间复杂度是O(n)
针对LinkedList,如果要删除中间元素,首先需要的就是找到该元素,如果我们频繁的删除中间元素,那么就会频繁的查找中间位置的元素然后才会执行删除操作。这样来说,其实并不比ArrayList所用的时间少。
源码中有几个例子,大家看看,如有任何疑问可以留言,我会尽我所能解答的。如有任何错误,请不吝赐教!
但是,虽然是一个很少用到的操作,其原理还是很值得大家学习的。
1.尾部删除
这种方式针对ArrayList和LinkedList 时间复杂度是一样的 都是常数时间
2.头部删除
这种方式针对ArrayList和LinkedList的时间复杂度是不同的
针对ArrayList
如果在头部删除元素,那么尾部元素会逐个向前移动一个位置,此时的时间复杂度是O(n)
针对LinkedList
此时在头部删除元素,只是将头部的下一个元素变成头部元素即可,原来的头部元素置为null(方便gc)。这样,时间复杂度是一个常数时间
3.中间位置删除
针对ArrayList,会将site()/2的元素向前移动一个位置,时间复杂度是O(n)
针对LinkedList,如果要删除中间元素,首先需要的就是找到该元素,如果我们频繁的删除中间元素,那么就会频繁的查找中间位置的元素然后才会执行删除操作。这样来说,其实并不比ArrayList所用的时间少。
package com.luzm.datastructure.list; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class TestList { public static void main(String[] args) { List<Integer> arrayList = new ArrayList<Integer>(); List<Integer> linkedList = new LinkedList<Integer>(); generateList(arrayList); generateList(linkedList); System.out.println("测试ArrayList"); testRemove(arrayList); System.out.println("测试LinkedList"); testRemove(linkedList); } public static void generateList(List<Integer> list) { for(int i = 0 ; i < 100000 ; i ++) { list.add(i); } } /** * 测试删除,删除偶数 * @param list */ public static void testRemove(List<Integer> list) { if (list == null) { return; } if (0 == list.size()) { return; } // 方式1 long before = System.currentTimeMillis(); // for (int i = 0; i < list.size(); i++) { // if (list.get(i) % 2 == 0) { // list.remove(i); // } // } long after = System.currentTimeMillis(); // System.out.println("使用for循环的方式 使用时间:" + (after - before) + "毫秒"); //方式2 -增强for循环 -抛出异常 // before = System.currentTimeMillis(); // for(Integer tem : list) { // try{ // if(tem % 2 == 0) { // list.remove(tem); // } // } catch (Exception ex) { // System.out.println(ex); // System.out.println("增强for循环异常"); // } // } // after = System.currentTimeMillis(); // System.out.println("使用增强for循环 使用时间:" + (after - before) + "毫秒"); //方式3-Iterator方式 Iterator<Integer> ite = list.iterator(); before = System.currentTimeMillis(); while(ite.hasNext()) { if(ite.next() % 2 == 0) { ite.remove(); } } after = System.currentTimeMillis(); System.out.println("使用Iterator方式 使用时间:" + (after - before) + "毫秒"); } }
源码中有几个例子,大家看看,如有任何疑问可以留言,我会尽我所能解答的。如有任何错误,请不吝赐教!
相关文章推荐
- LeetCode 203:Remove Linked List Elements
- [Leetcode]Remove Linked List Elements
- [LinkedIn]linked List data structure so that add/insert, remove, get random in O(1) constant time
- *Remove Linked List Elements
- [LeetCode] Remove Linked List Elements
- Leetcode--Remove Linked List Elements
- [LeetCode 203] Remove Linked List Elements
- LeetCode - Remove Linked List Elements
- [Leetcode]#203 Remove Linked List Elements
- Remove Linked List Elements
- leetcode--Remove Linked List Elements
- Remove Linked List Elements
- Remove Linked List Elements
- leetcode 203 Remove Linked List Elements C++
- [leetcode] Remove Linked List Elements
- Leetcode Remove Linked List Elements 删除链表中的元素
- leetcode 203 Remove-Linked-List-Elements
- 【leetcode 203 Remove Linked List Elements 】
- 【LeetCode OJ 203】Remove Linked List Elements
- leetcode---Remove Linked List Elements