队列是一种先进先出的数据结构。
现在有一组数据:12、23、34、45、56
将它们一次放入队列中是如下情况。
有图可以看出队列是从队尾进元素,队头出元素,也就是先进先出。
入队操作是相当于链表的插入一个节点操作。
public ListNode head;//头
public ListNode tail;//尾
public int uesdSize = 0;//元素个数
ListNode node = new ListNode(val);
if (this.head == null) {
}
this.head = node;
this.tail = node;
tail.next = node;
tail = tail.next;
尾结点的地址域存新节点的地址,然后尾结点指向新节点。
关于链表尾插法详解请参考我的另一篇文章:
链接:
https://blog.csdn.net/m0_63033419/article/details/127355701?spm=1001.2014.3001.5501
this.uesdSize++;
//使用尾插法往队列里放元素
public void offer(int val) {
ListNode node = new ListNode(val);
//如果链表是空的
if (this.head == null) {
//将头和尾指向node
this.head = node;
this.tail = node;
}else {
//链表不是空的 - 在队尾插入结点
tail.next = node;//尾结点与node链接
tail = tail.next;//尾结点指向下一个
}
this.uesdSize++;//个数加1
}
出队操作就相当于是从链表的头部删除一个结点。
if (this.head == null) {
return -1;
}
int ret = this.head.val;
this.head = this.head.next;
if (this.head == null) {
this.tail = null;
}
//出队列 - 删除单链表的头结点
public int poll() {
//若链表为空
if (this.head == null) {
return -1;
}
//链表不为空
int ret = this.head.val;//接受当前头结点的值
this.head = this.head.next;//head指向下一个
if (this.head == null) {
this.tail = null;
}
this.uesdSize--;//个数减1
return ret;//ret就是出队的值
}
if (this.head == null) {
return -1;
}
return this.head.val;
public int peek() {
if (this.head == null) {
return -1;
}
//不为空 - 返回值但不改变指向
return this.head.val;//返回当前头结点的值
}