一、什么是LinkedList集合
LinkedList:LinkedList类实现了List接口和Collection接口,是List接口的链接列表实现。允许所有元素(包括 null)。这些操作允许将链接列表用作堆栈、队列或双端队列。此类提供队列操作,以及其他堆栈和双端队列操作。所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
说明:(1)LinkedList说白了就是集合的链表实现,该链表是双重链表(有一个next指针和一个prev指针),在LinkedList中的方法可以实现堆栈、队列的操作
(2) 在LinkedList集合中不仅可以通过链表来顺序获取集合元素,而且可以通过索引获取集合元素。
二、LinkedList集合特有的方法
- void addFirst(E e) 将指定元素插入此列表的开头。
void addLast(E e) 将指定元素添加到此列表的结尾。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
System.out.println("linked: "+linked);
linked.addFirst(3);
System.out.println("使用addFirst方法添加元素后linked:"+linked);
linked.addLast(4);
System.out.println("使用addLast方法添加元素后linked:"+linked);
运行结果:
- (1) E element() 获取但不移除此列表的头元素。
说明:这个方法是获取头元素与peek()方法有一样的结果,且等效于getFirst(),此方法与peek() 唯一的不同在于:如果此双端队列为空,它将抛出一个异常。
(2) E getFirst() 返回此列表的第一个元素。
说明:这个方法是获取头元素与peekFirst()方法有一样的结果,且等效于element(),此方法与 peekFirst() 唯一的不同在于:如果此双端队列为空,它将抛出一个异常。
(3) E getLast() 返回此列表的最后一个元素。
说明: 这个方法是获取尾元素与peekLast()方法有一样的结果,此方法与 peekLast() 唯一的不同在于:如果此双端队列为空,它将抛出一个异常。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
linked.add(3);
linked.add(4);
System.out.println("linked: "+linked);
Integer el = linked.element();
System.out.println("element方法获取集合的头元素为:"+el);
System.out.println("linked: "+linked);
Integer fir = linked.getFirst();
System.out.println("getFirst方法获取集合的头元素为:"+fir);
Integer last = linked.getLast();
System.out.println("getLast方法获取集合的尾元素为:"+last);
运行结果:
注意:E peek() 获取但不移除此列表的头(第一个元素)。E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。与对应的E element()、 E getFirst() 和 E getLast()方法运行效果一样,故不多赘述
- (1) E poll() 获取并移除此列表的头元素(第一个元素)
说明:此方法会获取头元素并移除,等效于pollFirst方法,如果此列表为空,则返回 null。
(2)E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
说明:此方法会获取头元素并移除,等效于poll方法,如果此列表为空,则返回 null。
(3) E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
说明:此方法会获取尾元素并移除,如果此列表为空,则返回 null。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
linked.add(3);
linked.add(4);
System.out.println("linked: "+linked);
Integer el = linked.poll();
System.out.println("poll方法获取集合的头元素为:"+el);
System.out.println("linked: "+linked);
Integer fir = linked.pollFirst();
System.out.println("pollFirst方法获取集合的头元素为:"+fir);
System.out.println("linked: "+linked);
Integer last = linked.pollLast();
System.out.println("pollLast方法获取集合的尾元素为:"+last);
System.out.println("linked: "+linked);
运行结果:
注意:E remove() 移除并返回此列表的第一个元素。E removeFirst() 移除并返回此列表的第一个元素。E removeLast() 移除并返回此列表的最后一个元素。这些方法与 对应的poll 方法唯一不同在于:如果此双端队列为空,它将抛出一个异常。 这里不多赘述
- (1)int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
(2) int indexOf(Object o)返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
linked.add(3);
linked.add(1);
System.out.println("linked: "+linked);
int fir = linked.indexOf(1);
System.out.println("linked集合中首次出现1的索引:"+fir);
int las = linked.lastIndexOf(1);
System.out.println("linked集合中最后出现1的索引:"+las);
运行结果:
- (1) boolean offer(E e) 将指定元素添加到此列表的末尾(最后一个元素)。
说明:将指定元素插入此LinkedList集合的尾部;如果添加不违反容量限制的话,则添加成功,返回 true,如果当前没有可用的空间,则返回 false。当使用有容量限制的LinkedList集合时,此方法通常优于 add方法,后者可能无法插入元素,而只是抛出一个异常。此方法等效于 offerLast()。
(2) boolean offerFirst(E e) 在此列表的开头插入指定的元素。
说明:将指定元素插入此LinkedList集合的头部;如果添加不违反容量限制的话,则添加成功,返回 true,如果当前没有可用的空间,则返回 false。当使用有容量限制的LinkedList集合时,此方法通常优于 addFirst方法,后者可能无法插入元素,而只是抛出一个异常。
(3) boolean offerLast(E e) 在此列表末尾插入指定的元素。
说明:将指定元素插入此LinkedList集合的尾部;如果添加不违反容量限制的话,则添加成功,返回 true,如果当前没有可用的空间,则返回 false。 当使用有容量限制的LinkedList集合时,此方法通常优于 addLast方法,后者可能无法插入元素,而只是抛出一个异常。此方法等效于 offer()。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
System.out.println("linked: "+linked);
linked.offer(3);
System.out.println("使用offer方法后添加3元素后linked:"+linked);
linked.offerLast(4);
System.out.println("使用offerLast方法后添加4元素后linked: "+linked);
linked.offerFirst(0);
System.out.println("使用offerLast方法后添加0元素后linked: "+linked);
运行结果:
- (1) E pop() 从此列表所表示的堆栈处弹出一个元素。即返回并且移除这个元素
(2)void push(E e) 将元素推入此列表所表示的堆栈
注意:这两个方法只是依据堆栈的性质来使用的,也说明Linkedlis可以来模拟一个堆栈,并不是说明LinkedList就是堆栈实现。
使用这两个方法时候,索引小的一端为堆栈的Top(顶部),压栈和出栈操作都是从此次开始。
LinkedList<Integer> linked=new LinkedList<>();
linked.add(1);
linked.add(2);
linked.add(3);
System.out.println("linked: "+linked);
Integer pop = linked.pop();
System.out.println("使用pop方法获取元素为: "+pop);
System.out.println("使用pop方法获取元素后linked: "+linked);
linked.push(9);
System.out.println("使用push方法添加元素后linked: "+linked);
运行结果:
- (1) boolean removeFirstOccurrence(Object o) 从此集合移除第一次出现的指定元素。如果不存在该元素则不做更改,移除失败返回false,如果存在移除成功则返回ture
(2) boolean removeLastOccurrence(Object o) 从此集合中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。如果不存在该元素则不做更改,移除失败返回false,如果存在移除成功则返回ture
LinkedList<Integer> linked=new LinkedList<>();
linked.add(2);
linked.add(1);
linked.add(3);
linked.add(1);
linked.add(4);
linked.add(1);
System.out.println("linked: "+linked);
linked.removeFirstOccurrence(1);
System.out.println("移除第一次出现1后的linked: "+linked);
linked.removeLastOccurrence(1);
System.out.println("移除最后一次出现1后的linked: "+linked);
运行结果:
- E set(int index, E element) 将此集合中指定位置的元素替换为指定的元素。索引位置必须在集合索引范围内,如果替换成功则返回被替换的元素,否则抛出异常。
LinkedList<Integer> list=new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println("list:"+list);
Integer repalce = list.set(1, 6);
System.out.println("被替换的元素是:"+repalce);
System.out.println("使用set方法替换元素后list: "+list);
运行结果: