利用单向链表自定义队列
实现思想
😗*
准备工作 : 队列需要头部和尾部的指针head和last
第一次插入 : 队里是空第一次插入值让头部和尾部指针同时指向这个元素,因为是第一次插入嘛.所以第一个元素即是头部也是尾部
第N次插入 : 队列里第二次/N次插入值,头部指针不动,尾部指针的下一个元素应该指向插入的元素并且尾部指针需要更新成当前元素
描述苍白无力,看看图吧
取出元素 : 队列中取出元素,其实就是改变head的指针,返回head的val然后head指向head的下一个元素,很好理解。
看图 :
取出元素潜在BUG : 取出元素时需要判断当前head是否为空,如果为空需要手动释放last,原因是因为当只有一个元素时头部尾部头指向他,他被拿走了,head指向了head.next但是last依旧指向他,导致不能被JVM回收,所以需要手动释放
到这里大概的思想就是这样了。
代码示例
package linkedlist;
import java.util.Queue;
/**
* @Author chao
* @Version V1.0.0
* @Date 2021/10/26 14:29
*/
public class LinkedListQueue {
/**
* 定义一个单向链表结构
*
* @param <T> 泛型值
*/
public static class Node<T> {
private Node<T> next;
private T val;
public Node(T val) {
this.val = val;
}
}
public static class MyQueue<T> {
/**
* 定义头部指针
*/
private Node<T> head;
/**
* 定义尾部指针
*/
private Node<T> last;
/**
* 定义队列大小
*/
private int size;
/**
* 从队列头部插值
*
* @param t 元素
*/
public void offer(T t) {
// 给新加入的值创建一个节点
Node<T> cur = new Node<>(t);
// 判断当前队列中是否存在值
if (size == 0) {
// 如果是第一个元素头部指向当前元素
head = cur;
// 尾部指向当前元素
last = cur;
} else {
// 不是第一个元素,当前尾部的next指针指向当前元素
last.next = cur;
// 当前尾部指针指向当前元素(因为当前元素才是现在的尾部)
last = cur;
}
// 队列数量加一
size++;
}
/**
* 获取队列中头部元素
*
* @return 元素值
*/
public T poll() {
// 定义返回对象
T result = null;
if (head != null) {
// 设置返回值为head的val
result = head.val;
// 当前元素不为空时,需要把head指针指向下一个元素
head = head.next;
// 取出元素后size减一
size--;
} else {
// 当只有一个元素时头部尾部头指向他,他被拿走了,head指向了head.next
// 但是last依旧指向他,导致不能被JVM回收,所以需要手动释放
last = null;
}
return result;
}
/**
* 当前集合是否为空
*
* @return 为空返回true 否则返回false
*/
public boolean isEmpty() {
return size == 0;
}
}
public static void main(String[] args) {
MyQueue<String> queue = new MyQueue<>();
queue.offer("12");
queue.offer("13");
queue.offer("14");
while(!queue.isEmpty()){
System.out.print(queue.poll());
}
}
}