今天看了一篇关于带环单链表精讲的文章,在这里给大家做一个总结。之前看过很多有关单链表带环的文章,但是有些文章讲的太文章化,不容易理解,理论性太强。接下来我会用最简单通俗易懂的语言解析这个问题。
当你拿到一个单链表的数据信息时,我相信大部分的人都会选择去判断一下这个单链表是否有环?这也是最基本的反应。下面我给出单链表的数据结构:
typedef int Elemtype;
//头节点中的data域存放是链表的长度
typedef struct ListNode
{
Elemtype data;//值域
ListNode *m_pNext;//指针域
}ListNode,*PListNode;
链表的具体操作这里就不详细列出了,在我的前几篇博客中都有详细的代码。
一:那么我们接下来分析,如何判断一个链表是否有环呢?
我们采用假设的方法,我们先假设该链表就是一个带环的单链表,那么我们来分析:
有的同学会想到说,既然这个链表是带环的,那么从头开始遍历链表,直至找到某两个节点的地址一样,或者遍历到NULL。这是脑子直的人的想法也是最最简单易懂的方法 。
在单链表的很多处理的过程中我们都会采用一种很有效的处理方式:辅助指针(快慢指针),就像古人说的三个臭皮匠顶过一个诸葛亮。我们让快指针每次走两个单位,慢指针每次走一个单位,我们可以发现,当fast != NULL&&fast->next !=NULL,时只