当前位置:   article > 正文

LinkedList相关知识总结_liankedlist常考知识点

liankedlist常考知识点

一、概述

LinkedList 是链表实现的线性表(双链表)。是 Java 集合中比较常用的数据结构,与 ArrayList 一样,实现了 List 接口,只不过 ArrayList 是基于数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。而 LinkedList 是基于链表实现的,插入、删除时只需要改变前后两个节点指针指向即可。所以 LinkedList 插入和删除方面要优于 ArrayList,而随机访问上ArrayList 性能更好。

除了 List 接口之外,LinkedList 还实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。

二、特征

1、数据是按照插入有序,输出顺序与输入顺序一致

2、数据是可以重复插入的

3、集合是可以存储null的

4、底层采用的数据结构是双向链表

5、要找到某个结点,必须从头开始遍历。(查询慢,增删快)

三、

1.继承关系

  1. public class LinkedList<E> extends AbstractSequentialList<E>
  2. implements List<E>, Deque<E>, Cloneable, java.io.Serializable

AbstractSequentialList抽象类继承自AbstractList,是对常见的方法做了实现,便于子类直接复用

该接口也实现了list借口,能够实现克隆,实现序列化

实现了deque接口,而该接口是一个双端队列接口,LinkedList也是Queue接口的实现类,而且可以借助于该队列实现队列、可以实现栈

Deque提供了特定方法如下:

提供了从头、从尾的增删改查操作

 2.属性和默认值

LinkedList底层是一个双向链表

  1. //定义了集合中数据的格式
  2. transient int size = 0;
  3. //头节点位置
  4. transient Node<E> first;
  5. //尾节点位置
  6. transient Node<E> last;
  7. private static class Node<E> {
  8. E item;
  9. Node<E> next;
  10. Node<E> prev;
  11. Node(Node<E> prev, E element, Node<E> next) {
  12. this.item = element;
  13. this.next = next;
  14. this.prev = prev;
  15. }
  16. }

3.构造函数

  1. //无参构造函数
  2. public LinkedList() {
  3. }
  4. //通过Collection集合来实例化LInkedList的实例
  5. public LinkedList(Collection<? extends E> c) {
  6. this();
  7. addAll(c);
  8. }

四、常见的方法分析

1.add:添加元素

  1. public boolean add(E e) {
  2. linkLast(e);
  3. return true;
  4. }
  5. void linkLast(E e) {
  6. final Node<E> l = last;
  7. //新构造node节点以链表的尾节点作为前驱,将新节点插入到链表的尾部,尾插法
  8. final Node<E> newNode = new Node<>(l, e, null);
  9. //将新节点作为尾节点
  10. last = newNode;
  11. if (l == null)
  12. //当前插入的是第一个节点,first=last=newNode
  13. first = newNode;
  14. else
  15. //当前链表上已经存在节点
  16. l.next = newNode;
  17. size++;
  18. modCount++;
  19. }

添加元采用尾将尾节点插入链表,将size+1

2.remove:删除元素

本质上是双向链表的删除节点的过程

  1. public boolean remove(Object o) {
  2. //删除的元素判断是否为null,判断相等逻辑会不同 o==null? ==:equals
  3. if (o == null) {
  4. for (Node<E> x = first; x != null; x = x.next) {
  5. if (x.item == null) {
  6. unlink(x);
  7. return true;
  8. }
  9. }
  10. } else {
  11. for (Node<E> x = first; x != null; x = x.next) {
  12. if (o.equals(x.item)) {
  13. unlink(x);
  14. return true;
  15. }
  16. }
  17. }
  18. return false;
  19. }
  20. //删除双向链表的节点逻辑
  21. E unlink(Node<E> x) {
  22. // assert x != null;
  23. final E element = x.item;
  24. final Node<E> next = x.next;
  25. final Node<E> prev = x.prev;
  26. if (prev == null) {
  27. first = next;
  28. } else {
  29. prev.next = next;
  30. x.prev = null;
  31. }
  32. if (next == null) {
  33. last = prev;
  34. } else {
  35. next.prev = prev;
  36. x.next = null;
  37. }
  38. x.item = null;
  39. size--;
  40. modCount++;
  41. return element;
  42. }

3.get():获取节点元素

  1. public E get(int index) {
  2. //判断位置的合法性
  3. checkElementIndex(index);
  4. return node(index).item;
  5. }
  6. private void checkElementIndex(int index) {
  7. if (!isElementIndex(index))
  8. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  9. }
  10. private boolean isElementIndex(int index) {
  11. return index >= 0 && index < size;
  12. }
  13. //从链表中的位置index来找到节点Node
  14. Node<E> node(int index) {
  15. //通过二分查找来确定要查找元素的位置,在size/2前半部分,采用从前往后查找,否则,从后往前查找
  16. if (index < (size >> 1)) {
  17. Node<E> x = first;
  18. for (int i = 0; i < index; i++)
  19. x = x.next;
  20. return x;
  21. } else {
  22. Node<E> x = last;
  23. for (int i = size - 1; i > index; i--)
  24. x = x.prev;
  25. return x;
  26. }
  27. }

总结:

  1. 从源码可以看出 LinkedList 是基于链表实现的。

  2. 在查找和删除某元素时,区分该元素为 null和不为 null 两种情况来处理,LinkedList 中允许元素为 null。

  3. 基于链表实现不存在扩容问题。

  4. 查找时先判断该节点位于前半部分还是后半部分,加快了速度

  5. 因为基于链表,所以插入删除极快,查找比较慢。

  6. 实现了栈和队列的相关方法,所以可作为栈,队列,双端队列来用。

ArrayList和LinkedList区别:

1、ArrayList是基于动态数组的数据结构、LinkedList是基于链表实现

2、对于随机访问的get和set方法,ArrayList有优于LInkedList,因为LInkedList要移动指针

3、对于新增和删除操作,LinkedList比较占优势,因为ArrayList要移动数据

应用场景:

ArrayList使用在查询比较多场景,而LinkedList适用于插入删除比较多场景

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/843768
推荐阅读
相关标签
  

闽ICP备14008679号