Java链表---巩固强化

1.前言

在介绍链表之前,先简单介绍下Java库中的具体集合以及它们各自功能描述,如下图所示。而且如果只是介绍某个结构方法的话,我觉得这样也有点难理解,所以,在之后介绍的数据结构中,会通过大量的实例演示来加深理解。希望了解完所有结构后能灵活运用。
在这里插入图片描述

2.链表

你也许曾经在数据结构课程中学习过如何实现链表。在链表中添加或删除元素时,绕来绕去的指针可能已经给人们留下了极坏的印象。如果真是如此的话,你肯定会为Java集合类库提供了一个LinkedList类而感到高兴。
在下面的代码示例中,先添加3个元素,然后再将第2个元素删除:
在这里插入图片描述
不过,链表与泛型集合之间有一个重要的区别。链表是一个有序集合,每个对象的位置十分重要。LinkedList.add方法将对象添加到链表的尾部。但是,常常需要将元素添加到链表的中间。由于迭代器描述了集合中的位置,所以这种依赖于位置的add方法将由迭代器负责。只有对自然有序的集合使用迭代器添加元素才有实际意义。而我们之后要讨论的集数据类型中,元素是完全无序的。因此,Iterator接口中没有add方法。实际上,集合类库提供了一个子接口ListIterator,其中包含add方法:
LinkedList类的listIterator方法返回一个实现了ListIterator接口的迭代器对象。

ListIterator<String> iter=staff.listIterator();

add方法在迭代器位置之前添加一个新对象。例如,下面的代码将越过链表中的第一个元素,在第二个元素之前添加“D”。 在这里插入图片描述
如果多次调用add方法,将按照提供的次序把元素添加到链表中。它们被依次添加到迭代器当前位置之前。如下图,添加D,E. 在这里插入图片描述 set方法用一个新元素替换调用next或previous方法返回的上一个元素。例如,下面的代码将用一个新值替换链表的第一个元素: 在这里插入图片描述
现在已经介绍了Linked类的基本方法。可以使用ListIterator类从前后两个方向遍历链表中的元素,以及添加和删除元素。Collection接口还声明了操作链表的很多其他有用的方法。其中大部分方法都是在LinkedList类的超类AbstractCollection中实现的。例如,toString方法调用了所有元素的toString,并产生了一个格式为【A,B,C】的长字符串。如下图所示: 在这里插入图片描述
在Java类库中,还提供了许多在理论上存在一定争议的方法。链表不支持快速随机访问。如果要查看链表的第n个元素,就必须从头开始,越过n-1个元素。没有捷径可走。鉴于这个原因,需要按整数索引访问元素是,程序员通常不选用链表。不过,LinkedList类还是提供了一个用来访问某个特定元素的get方法:
LinkedList list=…;//实例演示如下: 在这里插入图片描述
当然,这个方法的效率并不太高。如果发现自己正在使用这个方法,说明对于所要解决的问题,你可能使用了错误的数据结构。绝对不应该使用下面这个“虚假”的续集访问方法来遍历链表。下面这段代码的效率极低:想当初自己也这样用过,就很… 在这里插入图片描述
每次查找一个元素都要从列表的头部重新开始搜索。LinkedList对象根本没有缓存位置信息,所以还是老实的用迭代器吧。建议避免使用一整数索引表示链表中位置的所有方法。如果需要对集合进行随机访问,就使用数组或ArrayList,而不要使用链表。

猜你喜欢

转载自blog.csdn.net/Achenming1314/article/details/105815740