单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。
链表的节点结构如下:
typedef struct node
{
int data;
struct node *next;
}
最常用方法:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。
// 判断链表是否有环
bool IsLoop(NODE *head) // 假设为带头节点的单链表
{
if (head == NULL)
return false;
NODE *slow = head->next; // 初始时,慢指针从头节点开始走1步
if (slow == NULL)
return false;
NODE *fast = slow->next; // 初始时,快指针从头节点开始走2步
while (fast != NULL && slow != NULL) // 当单链表没有环时,循环到链表尾结束
{
if (fast == slow)
return true;
slow = slow->next; // 慢指针每次走一步
fast = fast->next;
if (fast != NULL)
fast = fast->next;
}
return false;
}