基于链表实现的队列(JAVA)
新开了一门外教课程,Object-oriented Programming(JAVA), 记录一些学习经验,以及部分和c++的区别感悟。本文主要有一个java垃圾回收机制的interesting point,与c++作为区分。(可以视为Check Balance文章的补充)
Plus: 之前学习数据结构对循坏队列链表等的知识有所掌握,但都是基于c++实现的。目前想记录下区别感悟。
poll()函数中(c++队列里的pop),因为c++中new出来的由程序员手动回收回收,所以删除头节点,头指针后移的同时,我们delete了该节点并释放了内存。但在java中,由于head的指向后移,没有任何引用指向头节点,所以java帮我们回收了这块内存。
需要注意的是,当head指向了最后一块节点,按常理head.next为空,循环结束了,但我们发现最后一个节点其实tail还指向着。所以当我们认为清空了队列,其实我们还剩一下块动态内存没有清空。我们需要加入这种情况。
代码如下,注意的部分注释标记。
public class ListQueue {
private LinkedNode head;
private LinkedNode tail;
private int size;
public ListQueue() {
this.head = null;
this.tail = null;
this.size = 0;
}
public void clear() {
head = tail = null;
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
public void offer(int n) {
if (size == 0)
{
head = new LinkedNode(n);
tail = head;
size++;
}
else
{
tail.next = new LinkedNode(n);
tail = tail.next;
size++;
}
}
public int poll() {
if (size == 0) { return 0; }
int temp = head.data;
head = head.next;
// interesting point
if (head == null)
{
tail = null;
}
size--;
return temp;
}
private class LinkedNode {
int data;
LinkedNode next;
LinkedNode(int data) {
this.data = data;
next = null;
}
}
}