用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 节点类,所以我们需要自己写一个内部使用的节点类 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类型。