算法与数据结构(二) 基于链表的队列

来源:互联网 发布:网络是把双刃剑章郑 编辑:程序博客网 时间:2024/05/01 03:21

基于链表的队列

  • 一个数据的集合如果以链表来保存,那么它的容量就是无限的。
  • 实现的过程中,需要注意链表为空的情况下,需要对头引用和尾引用做特殊处理。

实现代码

/** * Created by 18855127160 on 2016/4/27. */import java.util.Iterator;/** * 基于链表的队列。 * Created by zangdonglai on 4/26/16. */public class MyLinkedQueue<T> implements Iterable{    Node firstNode;     //  链表的头结点    Node lastNode;      //链表的尾结点    int N=0;            //链表的长度    /**     * 链表类,一个泛型变量item 保存数据,     * Node 指向下一个结点     */    class Node{        public T item;        public Node next;    }    /**     * Queue 遍历器     */    private class QueueIterator implements Iterator{        Node currentNode =firstNode;        @Override        public boolean hasNext() {            return  currentNode!=null;        }        @Override        public Object next() {            T item=currentNode.item;            currentNode=currentNode.next;            return item;        }        @Override        public void remove() {        }    }    /**     *  入队操作,需要注意链表为空的情况。     *  以下两种方式都可实现入队。     *  方式一是, 先创建一个游离的结点(包装入队数据),在把这个节点连在原来的链表上,  在把尾结点指向  新添加的结点。     *  方式二是, 新建一个引用指向老的尾结点, 尾结点指向一个新建的游离的结点(包装入队数据)。再把老尾结点和尾结点连接起来。     */    public void enQueue(T t){/*        Node node=new Node();        node.item=t;        node.next=null;       if(isEmpty()){           firstNode=node;           lastNode=node;       }else {           lastNode.next=node;           lastNode=node;       }*/        Node oldLastNode =lastNode;        lastNode =new Node();        lastNode.item =t;        lastNode.next= null;        if(isEmpty()) firstNode=lastNode;        else           oldLastNode.next=lastNode;        N++;    }    /**     * 出队操作,注意队列为空时,要对尾结点进行赋空。     * @return     */    public T pop(){        T item=firstNode.item;        firstNode=firstNode.next;        if(isEmpty()) lastNode=null;        N--;        return item;    }    //队列的大小    public int size(){ return N;}    public boolean isEmpty(){ return  N==0;}    @Override    public Iterator iterator() {        return new QueueIterator();    }    public static void main(String args[]){        MyLinkedQueue<String> lInkedQueue=new MyLinkedQueue<>();        lInkedQueue.enQueue("A");        lInkedQueue.enQueue("A");        lInkedQueue.enQueue("A");        lInkedQueue.enQueue("A");        lInkedQueue.enQueue("B");        lInkedQueue.enQueue("C");        System.out.println(lInkedQueue.pop());        System.out.println(lInkedQueue.pop());        System.out.println(lInkedQueue.pop());        System.out.println(lInkedQueue.pop());        System.out.println(lInkedQueue.pop());        System.out.println(lInkedQueue.pop());    }}
1 0