欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用Linklist来实现队列(queue)

程序员文章站 2022-04-27 15:13:13
...

用链表Linklist 来实现队列(queue)队列可以用数组(ArrayList)或者链表(Linklist)来实现,队列(queue)是(先进先出(FIFO))擅长删除,插入数据。[  建议在思考下面节点的指向时用画图会更清楚直观 ]

 

Linklist来实现队列(queue)先创建一个MyLinkList 类  代码如下:

public class MyLinkList<E>{

}    //(E)是泛型 在还没确定往队列里面存放什么数据的时候,用泛型,这样等到对象创建是可以确定任意的类型

 创建节点个数为0的来链表 代码如下:

 

 

 

public class MyLinkList<E>{
Node head = null;
Node last  =null;
int num; //定义num来计数 链表中的节点数
} 

 在创建节点时候用到Node 节点类,所以我们需要自己写一个内部使用的节点类 NodeMyLinkList类中使用;

public class MyLinkList<E>{
Node head = null;
Node last  =null;
int num;
private class Node{
   E e;                       //定义一个泛型的数据e
   Node next;                   //定义节点next
       public Node(E e){				 //Node 带参数e的构造函数
  this.e = e;               
       }
}
}

 

 

创建2个类(MyLinkList)和(Node)后 可以写方法pushE e)将数据e 压入队列中

 

在用链表实现队列的时候记住链表是节点不是动态数组(Arraylist)连续的位置,链表需要节点指向下一个位置的节点 (例如节点n 是头节点headn.next就是头节点下的第二个节点) 代码如下:

 

public void push(E e){
Node n = new Node(e);      //’先创建一个节点n, (e)尾节点n中的数据;
if(head ==null){			 //先进行判断链表的头节点是否为空,如果为空,那么n							  作为头节点,同时也是尾节点。
head = n;
last = n;
}else{
last.next = n; 			 //如果不是为空,则将节点n  放到节点last后面(last.next),
  同时n 也作为尾节点。 
last = n;			
}
    num++;					//节点数num自增。
}

 

 

 

public E get(){
		return head == null?null:head.e;  //采用三目运算符,进行判断头节点如果为空就输出null 否则输出head.e
	}

 写好压入数据入队列的方法,再写一个将数据弹出来的方法poll() ,弹出数据和压入数据差不多,就是节点的指向不同。节点弹出又返回值,需要用泛型E

 

public E poll(){
if(head==null){				//先判断链表是否为空,如果为空则弹出空数据,返回								(return)一个null值。
return  null;
}
Node n = head;			//创捷一个新的节点n 指向head 
head = n.next;				//头节点(head)和n 节点同时指向第一个节点,出队列     					  需要弹出第一个节点,就是节点n,所以                                                         头节点需要指向下一个节点(head = n.next)
n.next = null;				//然后头节点n节点的下一个指向就为null,可以弹出。
num - -;					//弹出数据,节点自减
return n.e;				//返回节点n 上面的数据 e
}

    

 

   创建一个size()方法来返回节点数num

 

public int size(){
    return num;			//创建一个size()方法来返回节点数num
	}

 

 

创建一个可以弹出队列第一个数据的方法get()    代码如下:

 

 

public E get(){
		return head == null?null:head.e;  //采用三目运算符(?)进行判断,如果头节点为空就返回null,否则返回head.e
	}

 返回方法除了用三目运算 也可以用流程控制语句(if   else)进行判断。

 

 

上面的方法时不能查看队列里面的数据,但是可以运行,测试过没问题,数据可以放进去,也可以弹出来,是FIFO类型。

 

 

 

 

 

 

 

 

 

相关标签: java 队列 queue