数据结构----链表(单链表,循环链表,双向表)

文章目录

  • 一、基本概念
  • 二、单链表的基本操作
    • 1.初始化和判断空表
    • 2.销毁单链表
    • 3.清空单链表
    • 4.求单链表的表长
    • 5.取第i个元素值
    • 6.按值查找
    • 7.插入结点
    • 8.删除结点
    • 9.头插法建立链表
    • 10.尾插法建立链表
  • 三、循环链表
  • 四、双向链表
    • 1.基本概念
    • 2.双向链表的插入
    • 3.双向链表的删除
  • 总结(单链表,循环链表,双向链表的比较)


一、基本概念

链表:用一组物理位置任意的存储单元来存放线性表的数据元素,逻辑次序和物理次序不一定相同。通过头指针进入链表,依次向后顺序扫描其余结点,因此各个寻找各个结点所花时间不相等(顺序存取法)。(顺序表为随机存取法)
结点=数据域+指针域。结点只有一个指针域为单链表,首尾相接为循环链表。
头结点:

  1. 头指针指向链表第一个结点,存储第一个数据为首元结点,首元结点前可能附设头结点。
  2. 无头结点时,头指针为空则为空表;有头结点时,头结点的指针域为空则为空表。
  3. 头结点的优势:便于首元结点的处理,在链表的第一个位置的操作和其他位置一致;便于空表和非空表的处理,都只需要判断头指针指向的结点的指针域。
  4. 头结点的数据域:可以为空,可以存储链表长度,头结点不是数据元素,不计入表长。
    带头结点的单链表:由表头唯一确定。

数据结构----链表(单链表,循环链表,双向表)_第1张图片
嵌套定义指针*next
定义头结点的指针代表了整个链表,用LinkList L;定义某一结点的指针则用LNode *p。
数据结构----链表(单链表,循环链表,双向表)_第2张图片

二、单链表的基本操作

1.初始化和判断空表

初始化即为定义一个头指针并指向一个指针域为空的头结点。
数据结构----链表(单链表,循环链表,双向表)_第3张图片

判断为空:判断头结点的指针域是否为空。
数据结构----链表(单链表,循环链表,双向表)_第4张图片

2.销毁单链表

从头指针开始,依次释放所有结点,让L指针由指向头结点依次往后,每次指针后移都删除上一个结点,直至L=NULL。
数据结构----链表(单链表,循环链表,双向表)_第5张图片

3.清空单链表

链表仍存在,但链表中无元素,成为空链表。销毁会删除头结点,清空仅保留头结点(相当于恢复到初始化的状态)。
指针p指向要删除的结点,指针q指向p的下一个结点,依次遍历所有结点。p为NULL时结束,并将头结点的指针域指向NULL。
数据结构----链表(单链表,循环链表,双向表)_第6张图片

4.求单链表的表长

从首元结点开始遍历,将当前结点的next域给指针并计数,直到指针指向NULL结束,i值即为表长。
数据结构----链表(单链表,循环链表,双向表)_第7张图片

5.取第i个元素值

从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个结点为止。因此,链表不是随机存取结构。
j用来遍历计数,p非空且ji说明为异常情况。
数据结构----链表(单链表,循环链表,双向表)_第8张图片

6.按值查找

获取数据的地址或者位于链表第几个元素。
算法:从第一个结点起,依次和数据e相比较,如果找到一个值和e相等的数据元素,则返回其地址或者位置;如果查遍整个链表等没有找到其值和e相等的元素,则返回0或者NULL。
数据结构----链表(单链表,循环链表,双向表)_第9张图片
数据结构----链表(单链表,循环链表,双向表)_第10张图片
时间复杂度类似于顺序表,平均为O(n)。

7.插入结点

找到第i-1个结点,生成新节点s,新结点的指针域指向ai,ai-1指向新结点s,s是存放新结点地址的指针。这个交换顺序要改变则需要另外一个指针预先存储ai的地址。
数据结构----链表(单链表,循环链表,双向表)_第11张图片
数据结构----链表(单链表,循环链表,双向表)_第12张图片
i>表长+1或者i<1时,插入位置非法。

8.删除结点

数据结构----链表(单链表,循环链表,双向表)_第13张图片
数据结构----链表(单链表,循环链表,双向表)_第14张图片
需要返回的链表L以及删除的数据e用引用传递。q为指向待删除结点的指针。
线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为O(1)。但是由于要从头查找前驱结点,故插入和删除所耗时间复杂度为O(n)。

9.头插法建立链表

数据结构----链表(单链表,循环链表,双向表)_第15张图片
数据结构----链表(单链表,循环链表,双向表)_第16张图片
时间复杂度为O(n)。

10.尾插法建立链表

数据结构----链表(单链表,循环链表,双向表)_第17张图片
数据结构----链表(单链表,循环链表,双向表)_第18张图片
时间复杂度为O(n)。

三、循环链表

循环链表:首尾相接,表中最后一个结点的指针域指向头结点,整个链表形成一个环。
优点:从表中任意一个结点出发均可找到表中其他结点。
数据结构----链表(单链表,循环链表,双向表)_第19张图片
由于经常在首尾操作,故用尾指针来表示单循环链表。
数据结构----链表(单链表,循环链表,双向表)_第20张图片
循环链表的合并:Tb接在Ta后面
数据结构----链表(单链表,循环链表,双向表)_第21张图片

四、双向链表

1.基本概念

数据结构----链表(单链表,循环链表,双向表)_第22张图片
双向链表比单链表多一个前驱指针*prior
数据结构----链表(单链表,循环链表,双向表)_第23张图片
数据结构----链表(单链表,循环链表,双向表)_第24张图片
数据结构----链表(单链表,循环链表,双向表)_第25张图片
p的前驱的后继结点和后继的前驱结点都是自己。

2.双向链表的插入

数据结构----链表(单链表,循环链表,双向表)_第26张图片
数据结构----链表(单链表,循环链表,双向表)_第27张图片

3.双向链表的删除

数据结构----链表(单链表,循环链表,双向表)_第28张图片
数据结构----链表(单链表,循环链表,双向表)_第29张图片
由于找到待删除或待插入的结点需要遍历链表,时间复杂度为O(n),故双向链表的插入,删除操作时间复杂度都为O(n)。

总结(单链表,循环链表,双向链表的比较)

数据结构----链表(单链表,循环链表,双向表)_第30张图片

你可能感兴趣的:(数据结构与算法分析,指针,链表,数据结构,算法)