美文网首页
c语言判断链表是否有环

c语言判断链表是否有环

作者: 一路向后 | 来源:发表于2022-06-22 21:43 被阅读0次

1.问题描述

判断给定的链表中是否有环。如果有环则返回true,否则返回false。

数据范围:链表长度 0 \le n \le 10000,链表中任意节点的值满足 |val| <= 100000

要求:空间复杂度 O(1),时间复杂度 O(n)

2.基本原理

起初,快指针和慢指针一起指向头节点。快指针每次走2步,慢指针每次走1布,直到走到尾节点。若快指针与慢指针相遇,则说明链表中有环;若不相遇,则说明链表中无环。

3.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef struct ListNode ListNode;

struct ListNode {
    int val;
    struct ListNode *next;
};

void ListPush(ListNode **head, int val)
{
    ListNode *pre = NULL;
    ListNode *cur = (*head);

    if(cur == NULL)
    {
        *head = (ListNode *)malloc(sizeof(ListNode));

        (*head)->val = val;
        (*head)->next = NULL;

        return;
    }

    while(cur)
    {
        pre = cur;
        cur = cur->next;
    }

    cur = (ListNode *)malloc(sizeof(ListNode));

    pre->next = cur;
    cur->val = val;
    cur->next = NULL;

    return;
}

void ListFree(ListNode **head)
{
    ListNode *next = NULL;
    ListNode *cur = (*head);

    while(cur)
    {
        next = cur->next;

        free(cur);

        cur = next;
    }

    *head = NULL;
}

void ListPrint(ListNode *head)
{
    ListNode *cur = head;

    while(cur)
    {
        printf("%d ", cur->val);

        cur = cur->next;
    }

    printf("\n");
}

short hasCycle(struct ListNode *head)
{
    struct ListNode *p = head;
    struct ListNode *q = head;
    short res = 0;

    while(1)
    {
        if(p == NULL)
        {
            break;
        }

        p = p->next;

        if(p == NULL)
        {
            break;
        }

        p = p->next;
        q = q->next;

        if(p == q)
        {
            res = 1;
            break;
        }
    }

    return res;
}

int main()
{
    ListNode *head = NULL;

    ListPush(&head, 1);
    ListPush(&head, 4);
    ListPush(&head, 5);

    printf("%d\n", hasCycle(head));

    ListFree(&head);

    return 0;
}

4.编译源码

$ gcc -o test test.c -std=c89

5.运行及其结果

$ ./test
0

相关文章

  • c语言判断链表是否有环

    1.问题描述 判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 ,链表中...

  • 常见的面试算法题

    判断链表是否有环

  • 141. 环形链表

    久违的LeetCode?,想尽快把链表的简单和中等题刷完 快慢指针法判断链表中是否存在环 1、C语言 2019.8...

  • 2022-02-27环形链表linked-list-cycle

    1.判断单链表是否有环 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续...

  • 141. 环形链表

    给定一个链表,判断链表中是否有环。

  • 141.环形链表

    给定一个链表,判断链表中是否有环。

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

  • java判断链表是否有环(两种方式实现)

    判断链表是否为带环链表 方法一、快慢指针移动判断 首先如何判断链表是否有环,这个时候首先需要知道链表是否为空,如果...

  • leetCode (js):141. 环形链表

    给定一个链表,判断链表中是否有环。(不使用额外空间) 示例:a-b-c-b 1、快慢指针 2、判断值 现在来分析一...

  • 链表之-环形链表

    在链表中如果有环,则很难遍历结束,最后超时,如果能够判断是否是环形链表,则简单很多给定一个链表,判断链表中是否有环...

网友评论

      本文标题:c语言判断链表是否有环

      本文链接:https://www.haomeiwen.com/subject/wvnuvrtx.html