今天弄了一下队列,使用链表实现
队列对高并发帮助挺大的,弄成请求队列 。哈哈
我理解的队列是先进先出,就像排队一样
接下来是代码实现
我们需要创建一个节点类
package queue; public class Node<T>{ Node<T> last; T val; Node<T> next; public Node() { } public Node(Node<T> last, T val, Node<T> next) { this.last = last; this.val = val; this.next = next; } public Node<T> getLast() { return last; } public void setLast(Node<T> last) { this.last = last; } public T getVal() { return val; } public void setVal(T val) { this.val = val; } public Node<T> getNext() { return next; } public void setNext(Node<T> next) { this.next = next; } }
没什么好说的,用链表将节点链接起来
接下来是弹出的方法
我们需要找到最前面排到的那个节点,然后对他进行处理,然后将它移除(就是把左右指针去掉)
public Node<T> pull(){ //保存下结果 Node<T> result=first; //如果第一个节点有下一个 if(first.getNext()!=null){ //那就将下一个节点的上一个节点地址消失 first.getNext().setLast(null); //然后将第一个节点的连接到下一个 first=first.next; //然后设置上一个节点为空(因为这个节点要作为第一个) first.setLast(null); } return result; }
然后是存数据进去的方法
public Node<T> push(Node<T> t){ last.next=t; t.last=last; last=t; return t; }
存进去,然后设置前后节点的引用
我们再写一个放啊来判断是否有下一个
public boolean hasNext(){ return cursor!=null; }
然后写一个方法next方便我们遍历
public Node<T> next(){ Node<T> resuslt=cursor; cursor=cursor.next; return resuslt; }
接下来是完整代码
package queue; /** * 队列简单模拟 * @author 张君 */ public class Queue<T> { public Node<T> first=new Node<>(); private Node<T> last=first; private Node<T> cursor=first; /** * 弹出节点,让他们线断掉 * @return */ public Node<T> pull(){ //保存下结果 Node<T> result=first; //如果第一个节点有下一个 if(first.getNext()!=null){ //那就将下一个节点的上一个节点地址消失 first.getNext().setLast(null); //然后将第一个节点的连接到下一个 first=first.next; //然后设置上一个节点为空(因为这个节点要作为第一个) first.setLast(null); } return result; } /** * 推进去,连线 * @param t * @return */ public Node<T> push(Node<T> t){ last.next=t; t.last=last; last=t; return t; } /** * 判断是否有下一个 * @return */ public boolean hasNext(){ return cursor!=null; } /** * 获得下一个 * @return */ public Node<T> next(){ Node<T> resuslt=cursor; cursor=cursor.next; return resuslt; } }