要判断链表是否有环,可以使用快慢指针的方法。

首先,定义两个指针,一个快指针(fast)每次移动两步,一个慢指针(slow)每次移动一步。

然后,遍历链表,每次移动指针,如果链表中存在环,那么快指针(fast)最终会追上慢指针(slow),即fast == slow;如果链表中不存在环,那么快指针最终会到达链表的尾部,即fast == NULL 或 fast->next == NULL。

以下是用C语言实现的代码:

#include <stdbool.h>

// 链表节点的定义
struct ListNode {
    int val;
    struct ListNode *next;
};

bool hasCycle(struct ListNode *head) {
    if (head == NULL || head->next == NULL) {
        return false;
    }
    
    struct ListNode *fast = head;
    struct ListNode *slow = head;
    
    while (fast != NULL && fast->next != NULL) {
        fast = fast->next->next;
        slow = slow->next;
        
        if (fast == slow) {
            return true;
        }
    }
    
    return false;
}

在主函数中,你可以创建一个有环或者无环的链表进行测试。例如:

int main() {
    // 创建一个有环的链表
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
    
    head->val = 1;
    head->next = node1;
    
    node1->val = 2;
    node1->next = node2;
    
    node2->val = 3;
    node2->next = node3;
    
    node3->val = 4;
    node3->next = node4;
    
    node4->val = 5;
    node4->next = head;  // 最后一个节点指向头节点,形成环
    
    bool hasCycle = hasCycle(head);
    if (hasCycle) {
        printf("链表有环\n");
    } else {
        printf("链表无环\n");
    }
    
    // 释放内存
    free(node4);
    free(node3);
    free(node2);
    free(node1);
    free(head);
    
    return 0;
}

这样,就可以判断链表是否有环了

判断链表是否有环 用c语言链表知识解决

原文地址: https://www.cveoy.top/t/topic/h9zz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录