Queue队列的分析以及手写实现

今天弄了一下队列,使用链表实现

队列对高并发帮助挺大的,弄成请求队列 。哈哈


我理解的队列是先进先出,就像排队一样


接下来是代码实现

我们需要创建一个节点类


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;
    }

}















猜你喜欢

转载自blog.csdn.net/u011546032/article/details/80399522