用链表实现队列

用单链表实现队列

package SingleLinkedListQueue;

import LoopQueue.Queue;

/*
 * 用链表实现队列 ,然后和数组实现队列比较一下时间复杂度
 */
public class LinkedListQueue<E> implements Queue<E>{
	private class Node{
//		声明两个成员变量:数据e,下一个节点next
		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();
			}	
	}
//   定义头节点、尾节点和size
	private Node head,tail;
	private int size;
	public LinkedListQueue(LinkedListQueue<E>.Node head, LinkedListQueue<E>.Node tail, int size) {
		this.head = null;
		this.tail = null;
		this.size = 0;
	}
	public LinkedListQueue() {
		this(null,null,0);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void enqueue(E e) {
		// TODO Auto-generated method stub
//     带插入节点
		 Node node =new Node(e);
//      入队时需要分类讨论下:如果队列为空
		 if(tail==null) {
			 tail=node;
			 head=tail;
		 }
//       队列不为空时
		 else {
			 tail.next=node;
			 tail=node;
		 }
		 size++;
	}
	@Override
	public E dequeue() {
		// TODO Auto-generated method stub
		if(isEmpty()) {
			throw new IllegalArgumentException("dequeue failed,queue is empty");
		}
//       出队的节点为队首这个节点
		Node delnode =head;
		head =delnode.next; //更新一下头部
		delnode.next =null;
		size--;
		if(isEmpty()) {
			tail =null;
		}
		return delnode.e;
	}
	@Override
	public E getFront() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			throw new IllegalArgumentException("getFront failed,queue is empty");
		}
		return head.e;
	}
	@Override
	public E getRear() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return size;
	}
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return size==0;
	}
	@Override
	public String toString() {
		StringBuilder res=new StringBuilder();
		res.append("queue=head:");
		Node cur =head;
		while(cur!=null) {
			res.append(cur+"->");
			cur=cur.next; 
			
		}
		res.append("null tail");
		return res.toString();
	}
	
	
}

测试:

package SingleLinkedListQueue;

import java.util.Random;

import LoopQueue.LoopQueue;
import LoopQueue.Queue;

public class LinkedListQueueTest {
public static void main(String[] args) {
	LinkedListQueue e =new LinkedListQueue<Integer>();
	for(int i=0;i<5;i++) {
		e.enqueue(i);
	}
	System.out.println(e);
	for(int i=0;i<5;i++) {
		e.dequeue();
	}
	System.out.println(e);
	System.out.println(e.getSize());
	 
	int opCount = 100000;
	LinkedListQueue<Integer> loopQueue = new LinkedListQueue<>();
    double time2 = testListQueue(loopQueue, opCount);
    System.out.println("ListQueue, time: " + time2 + " s");
    
}
private static double testListQueue(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;
}
}

测试结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金石不渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值