一、链表真题:2019年42题

解析:任何408真题但凡涉及链表的一定都会需要定义一个头节点,很容易被"初始时队列为空"这个条件迷惑,实际上只有一个头节点也是为空。
上面这个有关"头节点"的理解也没错,但这道题的关键在于:被视为"头节点"的那个节点是在变化的,而非静止不动的那一个头节点,可以类比"顺序表的循环队列"也需要一个空位来标志着队满。
事实上:将顺序表的直接类比过来就行了。

整体代码:
cpp
//首先定义链表节点
typedef struct LinkNode
{
int val;
LinkNode* next;
}LinkNode;
//链表结构体
typedef struct
{
LinkNode* front;
LinkNode* rear;
}QueueList;
QueueList Q;
//初始化链表
void InitQ(QueueList &Q)
{
LinkNode* q = new LinkNode();
q->next = q;
Q.front = Q.rear = q;
}
//入队
bool Push(QueueList &Q,int x)
{
if (Q.rear->next == Q.front)
{
LinkNode* q = new LinkNode();
Q.rear->val = x;
Q.rear->next = q;
Q.rear = q;
q->next = Q.front;
}
Q.rear->val = x;
Q.rear = Q.rear->next;
return true;
}
//出队
bool Pop(QueueList &Q, int &x)
{
if (Q.front == Q.rear) return false;
x = Q.front->val;
Q.front = Q.front->next;
}
二、13.4:树与二叉树原理解析
1、二叉树层次建树,必须用到"辅助队列"
三、01基础课:栈与队列
1、卡特兰数

2、共享栈
节省存储空间又降低了上溢的风险,解释如下:


不需要判断是否为头节点,因为不带头节点的链表栈顶会初始化为NULL;
结束!今天有点儿没睡好