上期文章介绍了单链表的一些基本功能函数,本次主要介绍循环链表的一些基本功能函数。循环链表其实就是将单链表的最后一个结点指向单链表的头结点,从而构成一个循环结构。本次函数功能主要包括链表创建函数(头插法和尾插法)、链表打印函数和两种链表是否有环的判定函数,以及最后的一个链表清除函数。
函数运行如下图所示:
功能函数
链表创建函数(头插法)
1 | //定义循环链表生成函数(头插法) |
这里使用了头插法对链表进行生成操作,L
作为cLinkList
的一个指针,指向链表的最后一个结点,这里注意最后要将L
指向p
构建循环。
链表创建函数(尾插法)
1 | //定义循环链表生成函数(尾插法) |
这里使用了尾插法对链表进行生成操作,L
作为cLinkList
的一个指针,在创建过程中不断向后移动,最后指向链表的最后一个结点,这里注意最后要将L
指向头结点指针head
构建循环。
链表打印函数
1 | void cListPrint(cLinkList *L) |
通过判定p->next != head
为条件对链表进行遍历打印,在遍历过程中计算链表的长度并打印输出。
检测是否有环(方法一)
1 | //检查是否有环(方法一) |
设置指针变量p
对链表进行遍历,同时使用q
对p
之前的结点进行遍历,如果发现到达p
所在结点的更短路径,则判定链表存在环。比如,p
走了6步到达结点A,而q
只需要3步即可到达结点A,则此时链表中必定存在环,换言之,此前p
已经经过结点A了。
检测是否有环(方法二)
1 | //检测链表是否有环(方法二) |
设置p
的步长为2,q
的步长为1,同时对链表进行遍历,如果在某个时刻p == q
,则就可以断定链表中存在环。
链表清除
1 | //链表清除函数 |
使用free()
函数对我们生成的链表空间进行遍历删除。
总体代码
1 |
|