B3631 单向链表 題解

· · 题解

B3631 单向链表 題解

管理员注:

阅读本文章前,请先阅读 \ \texttt{ShanCreeper} B 题库题解的声明,并了解由于课程需要不展示代码。

如需系统学习相关知识点请报名【洛谷-基础算法计划】

点赞上文章即代表您已阅读并熟知其内容。

维护一张初始只有元素 1 的表,支持以下操作:

如果有操作二,输出一个数字,并换行。

我们依旧可以看成一些人在排队,只不过多了一个插队和走人的操作。

我们假设初始排队顺序为:1 \ 4 \ 2 \ 3

若 5 号同学插队到 4 号的后面,那么会发生什么?

我们先来看看初始的链表情况:

i 1 2 3 4
\texttt{nxt}_i 4 3 0 2

此时,5 号同学插入 4 号的后面,那么链表就会变为:

i 1 2 3 4 5
\texttt{nxt}_i 4 ? 0 ? ?

此时 2 4 号的位置发送变化,我们一个一个的分析:

所以整个链表变为:

i 1 2 3 4 5
\texttt{nxt}_i 4 3 0 5 2

所以用代码实现是这样:

这时,2 号同学离开了队伍,那么又会发送什么?

那么链表会变为:

i 1 2 3 4 5
\texttt{nxt}_i 4 \texttt{before 3} 0 5 ?

所以变为:

i 1 3 4 5
\texttt{nxt}_i 4 0 5 3

改进:

我们可以用结构体减少内存。

原链表为:

i 1 2 3 4 5 6 7 8 9 10
a_i 9 7 0 4

浪费了很多的空间。

我们可以使用结构体:

i 1 2 3 4 5
\texttt{node}_i.\texttt{val} 1 4 7 9
\texttt{node}_i.\texttt{nxt} 4 3 0 2