📜  用于检测链表中循环的 C 程序(1)

📅  最后修改于: 2023-12-03 14:56:21.737000             🧑  作者: Mango

用于检测链表中循环的 C 程序介绍

链表是一种重要的数据结构,用于存储和管理数据。其中,单向链表和双向链表是比较常见的形式。在使用链表时,我们需要对其进行遍历、操作和修改。而在某些情况下,由于程序代码错误或者其他原因,链表中可能产生了循环,即出现了环形链表。为了排除这种问题,我们需要编写用于检测链表中循环的 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。