数据结构-线性表链式存储

216 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

线性表

线性表的链式表示和实现

有时候使用顺序存储并不能很好的解决问题,比如对于插入删除比较频繁的情况,使用顺序存储复杂度十分高。这时候就需要使用线性表的另一种存储方式——链式存储。

链式存储的特点是:逻辑相邻,物理不一定相邻。

链式存储的方式下图能很明显的表示:

image.png

由上图可以看出来,一个节点有两个位置,分别为存储数据的数据域,和存储直接后继位置位置的指针域。

旦链表的抽象数据类型描述如下:

Typedef struct Lnode {
    ElemType data; //数据域
    struct Lnode *next; //指针域
}Lnode, *LinkList; // *LinkList为Lnode类型的指针

单链表的查找

要读取第i个数据元素,必须从头指针起一直找到该结点的指针p

单链表的插入

单链表的插入就十分方便了,因为地址不是连续的所以只需要将要插入的节点的指针指向后一个节点,并改变前一个节点的指针指向要插入的元素。

image.png

但需要注意的是:改变指针的顺序不能改变,因为链表需要前一个节点的指针找到后一个节点,如果先将前一个节点的指针改变就找不到后面的元素了。

单链表的删除

删除也十分简单,通过下图可以清晰理解:

image.png

需要注意的是,在没有自动垃圾回收的语言中,需要手动释放节点空间。

单链表时间复杂度分析

由上面单链表插入、删除、查找的步骤分析可以看出单链表插入删除时间复杂度为O(1),查找为O(n)。根据不同存储的特点,可以在不同情况下进行选择。