链表队列的结构

上一节我们介绍了队列的顺序存储结构,也就是通过数组实现队列。这一节我们介绍队列的链式存储,也就是通过单链表来实现的队列,说的简单一点,链式存储的队列就是受限制的单链表。我们限定只能在单链表的头部删除,尾部增加,这样的单链表就是一个队列。

链队列的定义

我们在程序中声明一个LinkedQueue类表示链队列,队列里面维护了链表头front和链表尾rear。

internal class LinkedQueue
{
    Node front;//队头
    Node rear;//队尾
}

算法1:入队

入队相当于在尾部插入一个新的节点,需要执行两步操作:last.Next=newNode;last=newNode;

public void EnQueue(int data)
{
    Node newNode = new Node(data);
    if (front == null)
    {
        front = newNode;
        rear = newNode;
    }
    else
    {
        rear.Next = newNode;
        rear = newNode;
    }
}

算法2:出队

出队相当于删除链表的第一个节点,执行一步操作:front=front.Next;

public Node Dequeue()
{
    if (IsEmpty())
    {
        throw new Exception("队列为空!");
    }
    Node res = front;
    front = front.Next;
    return res;
}

算法3:查看队头元素

直接返回头节点front即可。

public Node Peek()
{
    return front;
}

算法4:队列是否为空

注意这里不能使用front==rear判断队列为空,因为当队列中只有一个节点的时候front和rear指向同一个节点。
public bool IsEmpty() { return front == null; }

示例代码地址

https://gitee.com/jiamingyuanjin_admin/data_struct/blob/master/DataStruct/08LinkedQueue.cs