关于链表的算法总结

版权声明: https://blog.csdn.net/if_i_were_a/article/details/82628525

1.头插法建立链表:

必须有一个终止条件,当输入为-1的时候表示输入的结束

头插法建立链表的函数是没有参数的传递的,在函数中用malloc来申请一个头结点

while的函数在最后一句要有scanf语句,表示等待下一个结点的值输入

头插法用代表头结点的链表,不用区别头结点是否为空,两条核心语句都可以搞定

头插法在建立链表的时候,输出的链表的数据域的值与输入值的顺序相反

在测试输出的时候需要传指向链表的指针

2.尾插法建立链表

scanf语句在while条件的前面也有一个

新建一个结点p的时候,必须给节点p的next复制为空,否则程序在最后输入的时候就会变成死循环

求链表的表长,还有按照链表的序号查找,按照链表的值查找,都是比较基础的,用for循环或者while语句都可以,无论使用while循环还是用for循环,二者的终止条件都需要想清楚

用for循环的时候,初始条件给的是h,或者h->next ,对于循环条件的判断都是不同的

3 单链表的插入

单链表的插入不用先判断插入的位置是否存在,可以用一个for循环,循环结束之后判断该位置是否存在,如果存在,就插入,如果不存在,就不插入

输入的是大于0的数字,而且是我们有时候惯性的把第一个数给为0,这个时候要注意二者的统一,计数的时候初值要注意

4 单链表的删除

切记先判断链表中时候有该值,然后根据题目要求看链表中的值时候时候有重复的值,有重复值和无从复制算法有所不同,如果有重复值,删除一个之后,free(p)下一次循环时候,P要执行q->next,如果要判断是否有所要删除的值时,加一个flag,如果flag没变,说明没有删除元素,即没有找到要删除的值

单链表的删除节点的时候,切记要用free释放空间

如果已知要删除的结点,时间复杂度为O(1)把下一个复制到当前,删除当前的,但是如果是尾结点的话,就要遍历链表,找到前一个结点

5.逆向输出链表

三种方法 用栈 用递归 用改变尾指针的位置,从后向前的方法

6将单链表中的最大值结点头插尾插

四个指针联动pmax,qmax,p,q

找到最大值结点,在当前位置删除,但是不能free,因为还要插入,头插判断最大值结点是否为头,如果是,就不用插入了,尾插同理,尾插的时候因为在循环中q指向的是链表的尾,所以尾插的时候q相当于t

7单链表值重复无序,删除重复值结点 两种方法,两个时间复杂度一样的

切记if后面要跟一个大括号,书上的代码比较少

8单链表的值升序有序,删除重复值结点 同7,但是只用一个while循环,因为是升序有序的,所以总安段当前的元素跟下一个元素时候一样,如果一样,删除下一个元素,如果不一样,当前的两个元素都往前面挪动一下

9链表的逆置(反转)head->next必须赋值为空,否则就是最后一个元素就是自己指向自己,输出的时候是无限输出最后一个元素

10将所有奇数结点放在偶数节点之前 主要p和q的初始位置,仔细想,head所指向的第一个节点是不用判断的无论他是奇数还是偶数

11升序排列一个链表 用选择排序的方法,需要申请另外一个头指针节点,找到最大的值,头插到另外一个头指针的前面 与链表的逆置不同,链表的逆置是从前向后有序的,所以p的位置是按照顺序的,判断p时候为空就可以知道时候链表已经逆置完,这个题判断时候已经排数完成最简单的方法就是看之前的链表时候为空

一般来说带表头节点的比较好操作,如果不申请空间,第一个链表每次动态分成两半,后面那一段的最大值要判断是不是头结点,代码的复杂度加大

12两个升序链表和并成一个升序列 递归和循环,时间复杂度相同,最好不用递归

循环有三种写法 可以不用申请空间,必须第二个小于等于第一个的某个未知的的时候,向前插

按照老师讲的那个写法的时候,while语句里面是&&条件链接,如果是数组的话,while里面用或连接,当两个数组的某一个完成时,在while语句里面直接就复制好了,但是里面一两个的是if...else if...else的连接方式

13创建单项循环链表并输出 单项循环链表的输出要用do while 语句,也可以用for循环,

14在值不重复的单项循环链表中删除值为key的节点 一定要注意判断最后值时候找到

判断时候找到节点的条件是p!=h

15判断两个链表时候交叉,返回交叉的第一个节点

cut表示的是两个隔的距离,因为要判断是否有交叉节点,所以需要判断最后一个元素的数据域的值时候相同,而不需要到空指针的位置,这样cut的值并不影响,因为两个链表都算空指针的地方。

16链表中环的入口结点 先判断链表时候有环,然后判断环是一共几个结点,然后第一个指针比第二个指针快几个位置,摆放指针完成之后然后找到环的节点的位置

猜你喜欢

转载自blog.csdn.net/if_i_were_a/article/details/82628525