用链表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 节点类,所以我们需要自己写一个内部使用的节点类 Node在MyLinkList类中使用;
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)后 可以写方法push(E e)将数据e 压入队列中
在用链表实现队列的时候记住链表是节点不是动态数组(Arraylist)连续的位置,链表需要节点指向下一个位置的节点 (例如节点n 是头节点head,n.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类型。