队列(先进先出)
本节使用改进的链表实现队列
从head端删除一个节点相对是容易的。
由于对这个链表的操作全部在链表的一侧完成,也就是head端或tail端完成,所以就不使用虚拟的头结点。是因为
不牵扯到对链表的中间元素进行删除或插入,所以也就没必要去统一→→对链表中间元素进行操作和对链表2侧元素进行操作他们之间会带来逻辑不统一的问题。
带有尾节点的入队和出队操作
1 @Override//入队 2 public void enqueue(E e){ 3 if(tail == null){ //tail为空,同时也说明head也为空, 4 tail = new Node(e); //在尾部插入一个节点 5 head = tail; 6 } 7 else{ 8 tail.next = new Node(e); 9 tail = tail.next; 10 } 11 size ++; 12 } 13 14 @Override//出队 15 public E dequeue(){ 16 if(isEmpty()) //首先判断能否出队 17 throw new IllegalArgumentException("Cannot dequeue from an empty queue."); 18 19 Node retNode = head;//出队元素所在节点应该是head位置所指的位置 20 head = head.next; 21 retNode.next = null; //执行完上面2行代码后,此时retNode.next指向head,执行 retNode.next = null,将retNode.next从将链表中断开 22 if(head == null) //执行了head = head.next;后,原来的head节点指向了它的下一个,新的head节点可能是空的 23 tail = null; 24 size --; 25 return retNode.e; 26 }