一 特性

  • 实现了Queue Deque接口
  • 适合删除操作
  • 可以包含重复的元素
  • 非线程安全的
  • 维护了元素的插入顺序

    二 属性

    ```java transient int size = 0;

    /**

    • Pointer to first node. 头结点
    • Invariant: (first == null && last == null) ||
    • (first.prev == null && first.item != null) */ transient Node first;

      /**

    • Pointer to last node. 尾结点
    • Invariant: (first == null && last == null) ||
    • (last.next == null && last.item != null) */ transient Node last;
  1. <a name="mOAnz"></a>
  2. # 三 重要方法
  3. - 没啥重要方法,Node的结构如下 是双向链表节点
  4. ```java
  5. private static class Node<E> {
  6. E item;
  7. Node<E> next;
  8. Node<E> prev;
  9. Node(Node<E> prev, E element, Node<E> next) {
  10. this.item = element;
  11. this.next = next;
  12. this.prev = prev;
  13. }
  14. }

四 添加

  1. /**
  2. * Links e as last element.
  3. * 添加时尾结点添加进入
  4. */
  5. void linkLast(E e) {
  6. final Node<E> l = last;
  7. final Node<E> newNode = new Node<>(l, e, null);
  8. last = newNode;
  9. if (l == null)
  10. first = newNode;
  11. else
  12. l.next = newNode;
  13. size++;
  14. modCount++;
  15. }

五 移除

  1. public boolean remove(Object o) {
  2. if (o == null) {
  3. //会遍历整个链表 这里处理了值是null不能equals的情况
  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. }