📅  最后修改于: 2023-12-03 14:56:21.737000             🧑  作者: Mango
链表是一种重要的数据结构,用于存储和管理数据。其中,单向链表和双向链表是比较常见的形式。在使用链表时,我们需要对其进行遍历、操作和修改。而在某些情况下,由于程序代码错误或者其他原因,链表中可能产生了循环,即出现了环形链表。为了排除这种问题,我们需要编写用于检测链表中循环的 C 程序。
在检测链表循环的程序中,我们需要使用快慢指针的方法。该方法通过两个指针(一个快指针、一个慢指针)同时遍历链表,并比较它们的值,来判断链表是否存在循环。具体实现方法可以基于两个指针。快指针每次向前移动两个节点,而慢指针则每次向前移动一个节点。如果链表中存在循环,那么快指针将会先遍历到循环中的节点,导致快慢指针相遇。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool hasCycle(struct ListNode *head) {
if (head == NULL) {
return false;
}
struct ListNode* slow = head;
struct ListNode* fast = head->next;
while (slow != NULL && fast != NULL && fast->next != NULL) {
if (slow == fast) { // 指针相遇,则链表存在循环
return true;
}
slow = slow->next;
fast = fast->next->next;
}
return false; // 遍历完链表未发现循环
}
代码中,我们首先进行了一个非空校验。如果链表为空,则肯定不存在循环,直接返回 false。然后初始化快指针和慢指针分别指向起始节点。在循环遍历链表时,我们使用了快慢指针方法,并且在遍历的过程中比较了它们的值。当它们相等时,即快指针已经遍历到循环中的节点,我们就可以判定链表中存在循环。最后,如果遍历完链表未发现循环,那么程序将会返回 false。