头插法 尾插法 建立单链表代码分析

=>  分为 头插法 和 尾插法

 

 

步骤:(带头结点情况)

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 肯定不会错

 

头插法重要性质:最终形成的单链表是逆置的!! 很多题目都会用到单链表逆置操作。  可用于链表的逆置!!!

如果不带头结点的单链表尾插法怎么实现呢?

 

基本操作很重要! 考试几乎不可能直接考察某种基本操作怎么实现,但是只要掌握了基本操作的实现精髓之后,这些思想就可以迁移,可以用于实现更复杂的一些算法和操作!

所以这也是为什么在学习一个数据结构的时候,要讨论逻辑结构、物理结构、基本操作(运算)!