4-7 带有尾指针的链表:使用链表实现队列

队列(先进先出)

本节使用改进的链表实现队列

从head端删除一个节点相对是容易的。

由于对这个链表的操作全部在链表的一侧完成,也就是head端或tail端完成,所以就不使用虚拟的头结点。是因为

不牵扯到对链表的中间元素进行删除或插入,所以也就没必要去统一→→对链表中间元素进行操作和对链表2侧元素进行操作他们之间会带来逻辑不统一的问题。

 

带有尾节点的入队和出队操作

 1  @Override//入队
 2     public void enqueue(E e){
 3         if(tail == null){ //tail为空,同时也说明head也为空,
 4             tail = new Node(e);  //在尾部插入一个节点
 5             head = tail;
 6         }
 7         else{
 8             tail.next = new Node(e);
 9             tail = tail.next;
10         }
11         size ++;
12     }
13 
14     @Override//出队
15     public E dequeue(){
16         if(isEmpty())            //首先判断能否出队
17             throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
18 
19         Node retNode = head;//出队元素所在节点应该是head位置所指的位置
20         head = head.next;
21         retNode.next = null;  //执行完上面2行代码后,此时retNode.next指向head,执行 retNode.next = null,将retNode.next从将链表中断开
22         if(head == null)   //执行了head = head.next;后,原来的head节点指向了它的下一个,新的head节点可能是空的
23             tail = null;
24         size --;
25         return retNode.e;
26     }

 

posted @ 2019-01-26 14:58  靖愁  阅读(538)  评论(0编辑  收藏  举报