链表实现队列:

十四 链表队列

 

链表队列的实现:

    package com.lt.datastructure.Queue;
    
    
    
    public class LinkedListQueue<E> implements Queue<E>{    
        public class Node{
            public E e;
            public Node next;
            public Node(E e,Node next){
                this.e = e;
                this.next = next;
            }
            public Node(E e){
                this(e,null);
            }
            public Node(){
                this(null,null);
            }
            
            @Override
            public String toString() {
                return e.toString();
            }
        }
        
        private Node head,tail;
        private int size;
        
        public LinkedListQueue() {
            head = null;
            tail = null;
            size = 0;
        }
        
        @Override
        public int getSize() {
            return size;
        }
        
        @Override
        public boolean isEmpty() {
            return size==0;
        }
        
        /*
         * 入队 
         * 如果tail尾结点是空,新建第一个结点,head和tail指向此结点
         * 如果tail不为空,在tail的下一个位置新建结点,当作尾结点
         */
        @Override
        public void enqueue(E e) {
           if(tail==null){
               tail = new Node(e);
               head = tail;
           }else{
               tail.next = new Node(e);
               tail = tail.next;
           }
           size ++;
        }
        
        @Override
        /*
         * 出队
         * 首先判断能不能出队,判断是否为空
         * 不为空,则删除头结点
         */
        public E dequeue() {
            
            if(isEmpty()){
                throw new IllegalArgumentException("Cannot dequeue from a Empty queue.");
            }
            //retNode指向head
            Node retNode = head;
            //head后移,为删除做准备
            head = head.next;
            //删除retNode
            retNode.next = null;
            
            //如果只有一个结点,删除之后让tail为空
            if(head == null) {
                tail =null;
            }
            size --;
            
            return retNode.e;
        }
        
        @Override
        public E getFront(E e) {
            if(isEmpty()){
                throw new IllegalArgumentException("Queue is empty.");
            }
            return head.e;
        }
        
        @Override
        public String toString() {
          StringBuilder res = new StringBuilder();
          res.append("Queue:front ");
          
          Node cur = head;
          while(cur != null){
              res.append(cur +"->");
              cur = cur.next;
          }
          res.append("null");
            return res.toString();
        }
        
        public static void main(String[] args) {
            LinkedListQueue<Integer> queue = new LinkedListQueue<>();
            for(int i =0; i<10; i++){
                queue.enqueue(i);
                System.out.println(queue);
                if(i%3==2){
                    queue.dequeue();
                    System.out.println(queue);        
                }
            }
            
        }
        
    }

 

测试:

十四 链表队列

 

复杂度测试:

 

package com.lt.datastructure.Queue;

import java.util.Random;

    public class Main {
         /*
         * 测试ArrayQueue和LoopQueue
         */
        private static double testQueue(Queue<Integer> q , int opCount){
            
            long startTime = System.nanoTime();
            //..
            Random random = new Random();
            for(int i =0; i<opCount;i++){
                q.enqueue(random.nextInt(Integer.MAX_VALUE));
            }
            for(int i=0; i<opCount; i++){
                q.dequeue();
            }
            long endTime = System.nanoTime();
            return (endTime-startTime)/1000000000.0;
        }    
        
      public static void main(String[] args){
      int opCount = 100000;
      ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();
      System.out.println("ArrayQueue:"+testQueue(arrayQueue,opCount));
      
      
      LoopQueue<Integer> loopQueue = new LoopQueue<>();
      System.out.println("LoopQueue:"+testQueue(loopQueue, opCount));
      
      LinkedListQueue<Integer> linkedListQueue = new LinkedListQueue<>();
      System.out.println("LinkedListQueue:"+testQueue(linkedListQueue, opCount));
   }
}

三种队列分别所需时间:

十四 链表队列

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-28
  • 2022-02-24
  • 2021-10-16
  • 2022-12-23
  • 2021-11-26
  • 2021-10-24
猜你喜欢
  • 2022-12-23
  • 2021-09-11
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案