数据结构与算法分析(Java语言描述)学习--第三天
第3章 表、栈和队列
抽象数据类型
抽象数据类型(ADT)是带有一组操作的一些对象的集合。
表ADT
表的简单数组实现
简单链表
每一个节点均含有表元素和到包含该元素后继元的节点的next链。最后一个单元的next链引用null。
remove方法通过修改一个next引用实现。
insert方法需要new从系统中取得一个新节点。
从链表中插入或删除不需要移动很多项。
双链表:每一个节点持有一个指向它在表中的前驱节点的链。
Java Collections API中的表
Collection接口
位于java.util包中。
size返回集合中的项数。
扩展了Iterable接口。
Iterator接口
实现Iterable接口的集合必须提供一个iterator的方法。
next给出集合的下一项,hasNext用来告诉是否存在下一项。
List接口、ArrayList类和LinkedList类
- List接口位于java.util包,继承了Collection接口。get和set可以访问或改变位置索引给定的表中指定位置上的项。
- ArrayList提供List的一种可增长数组的实现。优点在于对于get和set的调用花费常数时间,缺点在于新项的插入和现有项的删除代价昂贵。
- LinkedList提供List的双链表实现。优点在于新项的插入和现有项的删除均开销很小。提供方法addFirst和removeFirst、addLast和removeLast、getFirst和getLast等操作。缺点是不容易作索引,对get的调用是昂贵的。
- ArrayList和LinkedList对add的调用如果都是在末端进行那么花费的是常数时间,在前端运行则对于LinkedList它的运行时间是O(N),但是对于ArrayList运行时间是O(N2),因为前端添加是O(N)操作。循环使用get进行求和操作,ArrayList运行时间是O(N),LinkedList是O(N^2),因为对get的调用是O(N)操作。
- 对搜索而言,两者都是低效的。
remove方法对LinkedList类的使用
- 删除表中的偶数:使用LinkedList,迭代器的remove方法的调用。因为迭代器位于需要被删除的节点。
public static void removeEven(List<Integer> lst)
{
Iterator<Integer> itr = lst.iterator();
while(itr.hasNext())
if(itr.next() % 2 == 0)
itr.remove();
}
关于ListIterator接口
扩展了List的Iterator功能。
previous和hasPrevious使得表从后向前的遍历得以完成。