头插法 尾插法 建立单链表代码分析
=> 分为 头插法 和 尾插法
步骤:(带头结点情况)
1. 初始化一个单链表
2. 每次取一个数据元素,插入到表尾/表头
有了一个单链表之后,接下来我们每次取一个数据元素插入到这个单链表的尾部,这个操作可以用之前实现的按位序插入这个基本操作来实现。
https://blog.****.net/pikaqiu_JBR99/article/details/107593731
尾插法建立单链表:
初始化单链表
设置变量 length 记录链表长度
while 循环 {
每次取一个数据元素 e;
ListInsert(L,length+1,e)插到数据尾部;
lenth++;
}
每次这都是从头开始之后遍历,时间复杂度为 O(n^2)。
其实没有必要每次都从头开始寻找,可以设置一个表尾指针r,当要在尾部插入一个新的数据元素的时候,只需要对 r 结点进行一个后插操作即可!后插操作函数之前有介绍过:
后插操作完成之后,还需要把表尾指针往后移指向新的表尾元素,这样插入下一个数据的时候,还是对 r 进行后插操作。
课本代码:
只不过自己初始化一个单链表的时候会把头结点的指针设置为 NULL ,这里没有,因为头结点的指针会在后面被修改。
时间复杂度是 O(n); 如果不带头结点的单链表尾插法怎么实现呢?
头插法建立单链表
实质上也是对指定结点的一个后插操作。 =>每插入一个元素 就是对头结点执行一次后插操作。
头插法建立单链表:
初始化单链表
while 循环 {
每次取一个数据元素 e;
InsertNextNode(L,e);
}
// 前面代码会申请一个新的结点,如果不置为NULL, 头结点的指针有可能内存中某一片神秘的区域,因为可能申请的内存可能存在脏数据。
//建议: 不管在头插法还是尾插法中,如果要初始化一个单链表的话,最好养成这种写代码的好习惯,初始化 L->NULL 肯定不会错
头插法重要性质:最终形成的单链表是逆置的!! 很多题目都会用到单链表逆置操作。 可用于链表的逆置!!!
如果不带头结点的单链表尾插法怎么实现呢?
基本操作很重要! 考试几乎不可能直接考察某种基本操作怎么实现,但是只要掌握了基本操作的实现精髓之后,这些思想就可以迁移,可以用于实现更复杂的一些算法和操作!
所以这也是为什么在学习一个数据结构的时候,要讨论逻辑结构、物理结构、基本操作(运算)!