使用链表实现队列
1 public class LinkedListQueue2<E> implements Queue<E> { 2 3 private class Node { 4 public E e; 5 public Node next; 6 7 public Node(E e, Node next) { 8 this.e = e; 9 this.next = next; 10 } 11 12 public Node(E e) { 13 this(e, null); 14 } 15 16 public Node() { 17 this(null, null); 18 } 19 20 @Override 21 public String toString() { 22 return e.toString(); 23 } 24 } 25 26 private Node dummyHead, tail; 27 private int size; 28 29 public LinkedListQueue2() { 30 dummyHead = new Node(); 31 tail = dummyHead; 32 size = 0; 33 } 34 35 @Override 36 public int getSize() { 37 return size; 38 } 39 40 @Override 41 public boolean isEmpty() { 42 return size == 0; 43 } 44 45 @Override 46 public void enqueue(E e) { 47 48 tail.next = new Node(e); 49 tail = tail.next; 50 51 size++; 52 } 53 54 @Override 55 public E dequeue() { 56 if(this.isEmpty()) { 57 throw new IllegalArgumentException("Dequeue failed. Queue is empty."); 58 } 59 60 Node retNode = dummyHead.next; 61 dummyHead.next = retNode.next; 62 retNode.next = null; 63 if(dummyHead.next == null) { 64 tail = dummyHead; 65 } 66 size--; 67 return retNode.e; 68 } 69 70 @Override 71 public E getFront() { 72 if(isEmpty()) { 73 throw new IllegalArgumentException("Queue is empty."); 74 } 75 return dummyHead.next.e; 76 } 77 78 @Override 79 public String toString() { 80 StringBuilder res = new StringBuilder(); 81 res.append("Queue: front "); 82 Node cur = dummyHead.next; 83 while(cur != null) { 84 res.append(cur + "->"); 85 cur = cur.next; 86 } 87 res.append("NULL tail"); 88 89 return res.toString(); 90 } 91 92 public static void main(String[] args) { 93 LinkedListQueue2<Integer> queue = new LinkedListQueue2<>(); 94 for(int i=0; i<10; i++) { 95 queue.enqueue(i); 96 System.out.println(queue); 97 98 if(i % 3 == 2) { 99 queue.dequeue(); 100 System.out.println(queue); 101 } 102 } 103 System.out.println(queue.getSize()); 104 for(int i=0; i<7; i++) { 105 queue.dequeue(); 106 System.out.println(queue); 107 } 108 } 109 }