链表为什么断不了?是拿振金做的吗?
说了队列,说了栈,无论什么数据结构都离不开只能按一定顺序储存的结果,向特定位置加入某值的复杂度达不到 O ( 1 ) O(1) O(1)。天空一声巨响,链表闪亮登场 链表就是这千千万万数据结构中的一个例外。
链表的模型就是一条链(废话)!我们可以向这条链的任意一个地方加入一个新的节点,也可以删除任意的一个节点。
1.模型
链表,顾名思义,是以链的形式来储存一个表。而这个链就很有意思了,有条件的可以哪一个项链看一下,我们从任意一个节点出发,都可以直接找的它前后的节点,为了满足这个性质,我们可以对每个节点增加两个储存的量:指向前一个点的指针 f r o m from from,指向后一个点的指针 t o to to 。这样,每个点除了储存这个点的值,还储存了分别指向前后点的指针。
可以发现,项链总有个首尾,链表也一样。我们可以设立两个坐标,代表链表的头和链表的尾,即 h e a d head head 和 t a i l tail tail 坐标。我们链表的第一个节点的前节点指针指向 h e a d head head 坐标,最后一个节点的后节点指针指向 t a i l tail tail 坐标。所以链表的模型如图所示:
代码:
/*指针版*/ /*下标版*/
struct link {
struct link{
int value;/*数据*/ int value;/*数据*/
link* from, to;/*指针*/ int from, to;/*指针*/
};/*数据结构*/ }Link[Size];/*数据结构*/
link* head, tail; int head, tail, tot;
void init() {
void init() {
head = new link(); head = 1, tail = 2;
tail = new link(); tot = 2;
head->to = tail; Link[head].to = tail;
tail->from = head; Link[tail].from = head;
}/*初始化链表*/ }
2.操作
1.添加节点
由于链表的性质,链表的添加节点操作支持在任意一个你能找到的节点添加。
当我们在某一位置添加节点时,我们需要知道这个位置所对应的的 f r o m