02-链表

链表的定义:

链表是由若干结点组成,每个结点至少包括两部分信息:一个是元素数据,一个是指向下一个(上一个)元素地址的指针。链表的存储在物理上是非连续、非顺序的存储结构,数据元素之间是通过每个元素的指针来关联的。

链表的基本特点:

  1. 长度不确定,长度可动态变化

  2. 结点在内存地址是非连续的内存空间

  3. 增删效率高,只需要修改指针指向

  4. 查询效率低,时间复杂度O(n)

  5. 空间复杂度O(n)

链表的类型:

单链表

链表是一种不需要连续内存空间的线性表。

每个内存块被称为结点。

每个结点有一个 数据域和指针域,数据域用来存储数据,而指针 域用来保存下一个结点的地址。

单链表的尾结点指向 NULL。

而单链表是最简单的链表。可以将单链表想象成如下图所示:

单链表

双链表

双向链表,其实就是链表的每个结点都可以知道自己的前一个结点和后一个结点。

每个结点都有一个前驱指针和后驱指针,分别存储前一个结点和后一个结点在内存中的地址。

head 指向链表第一个有效结点。

双向链表

循环链表

循环链表,其实就是特殊的单链表。

单链表的尾结点指向 NULL,而循环链表的尾结点指向头结点,构成环状。

循环链表

链表的操作

链表的操作包括了创建、删除、插入、输出。

创建就是空间的分配,将头、尾指针及链表结点个数等初始化。

删除和插入根据被操作元素的位置可以细分为头删除(插入),尾删除(插入),中间删除(插入),以下详细介绍。

1. 插入操作

插入分为头插入,尾插入,中间插入。

1.1 头插入

头插入实际上是增加一个新节点,然后把新增加的结点指针指向原来头指针指向的元素,再把头指针指向新增的节点。

链表头插入

1.2 尾插入

尾插入也是增加一个新节点,该节点指针置为null,然后把原尾结点指针指向新增加的节点,最后把尾指针指向新增加的节点即可。

链表尾插入

1.3 中间插入

中间插入稍复杂,首先增加一个节点,然后新增节点的指针指向插入位置的后一个节点,把插入位置的前一个节点指针指向新插入节点即可。

链表中间插入

2. 删除操作

删除与插入类似,根据被操作元素的位置分为头删除,尾删除,中间删除。

2.1 头删除

删除头元素时,先将头指针指向下一个节点,然后把原头结点的指针置空即可。

链表头删除

2.2 尾删除

删除尾元素时,首先找到链表倒数第2个元素,然后把尾指针指向这个元素,接着把原倒数第2个元素的指针置空。

链表尾删除

2.3 中间删除

删除中间元素相对复杂一些,首先将要删除的节点的前一个节点指针指向要删除的节点的下一个节点,然后把要删除节点的指针置空。

链表中间删除
  1. 代码实现(Java)

Last updated

Was this helpful?