C程序:如何判断链表是否有环

这是个常见的面试题哦,总之我面试的时候遇到过, 当时没有答上来,回去后想出来下面的方法一,该法还有个附加优点,可以判断出链表在哪个地方形成环的(即如果想拆开这个环,从哪个地方断开)。

后来知道还有个经典算法,即使用两个指针,一快一慢向前试探,如果最终重合则链表有环,果然优美的算法。

#include <stdio.h>

typedef struct list {
    int data;
    struct list *next;
} LIST;

/* Method 1: check the occurrence of p->next from head to p */
int check_circle_1(LIST *head) {
    LIST *p = head, *q= NULL;

if (p == NULL)
        return 0;

while (p->next) {
        /* check whether p points to itself */
        if (p->next == p) {
            return 1;
        }

/* check the occurrence of p->next in head to p */
        q = head;
        while (q != p) {
            if (q == p->next) {
                return 1;
            }
            q = q->next;
        }
        p = p->next;
    }

/* p->next is NULL, not a circle */
    return 0;
}

/* Method 2: q goes faster than p, if at last p == q, means there's circle */
/* 优点:逻辑上简单。 缺点:无法具体知道从哪个点拆开该圈 */
int check_circle_2(LIST *head) {
    LIST *p, *q;
    p = head;

if (p == NULL)
        return 0;

q = p->next;

while (p != NULL && q != NULL) {
        if (p == q) {
            return 1;
        }
        p = p->next;
        if (q->next == NULL) {
            return 0;
        } else {
            q = q->next->next;
        }
    }
    return 0;
}
int main() {
    LIST a, b, c, *head = &a;
    a.next = &b;
    b.next = &c;
    c.next = &a;
    printf("%d/n", check_circle_1(head));
    printf("%d/n", check_circle_2(head));
}

C程序:如何判断链表是否有环相关推荐

  1. 判断链表是否存在环(及其延伸)

    有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环. 问题: 1.如何判断一个链表是不是这类链表? 2.如果链表为存在环,如果找到环的入口点 ...

  2. 数据结构---判断链表是否有环

    判断链表是否有环 判断链表是否有环 方法1 方法2 JAVA实现 问题扩展1 问题扩展2 判断链表是否有环 有一个单向链表,链表中有可能出现"环",就像下图这样.那么,如何用程序来 ...

  3. 【刷算法】判断链表是否有环以及返回入环节点

    题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...

  4. 双指针算法之快慢指针(一):力扣【判断链表是否有环】leetcode-141、142

    一.简介:什么是快慢指针? 快慢指针,顾名思义,无非就是设置一个快指针,一个慢指针,初始化的时候,快指针和慢指针都指向链表的头结点,前进的时候一个在前一个在后,结合起来可以十分巧妙的解决链表中的一些问 ...

  5. 剑指offer之判断链表是否包含环

    1 问题 判断链表是否包含环 2 思路 2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无. 3 代码实现 #include <stdio.h> #include <st ...

  6. 数据结构:单链表操作之如何判断链表是否带环及相关操作

    //判断链表是否有环 int HasCircle(Node* pHead) { Node* low=pHead; Node* fast=pHead;     while(fast != NULL &a ...

  7. 面试题:判断链表是否存在环

    题目:判断链表是否存在环 思路:定义快慢指针,如果两个指针相遇则一定存在环. 1 public bool IsCircled(Node First) 2 { 3 if (First == null | ...

  8. 快慢指针判断链表是否有环

    链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环. 我有时候就犯嘀咕,它俩一定 ...

  9. 数据结构-链表(判断链表是否有环)

    如何判断链表是否有环 方法1:采用快慢指针 /***************************** 函数名称:JudgmentLinkRing_1(PtrList list)* 功能描述:判断链 ...

最新文章

  1. 清华数为大数据应用低代码开发工具DWF 2021成长回顾
  2. ABP入门系列(7)——分页实现
  3. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏
  4. 直击阿里新一代数据库技术:如何实现极致弹性能力?
  5. python学习笔记(十)标准库pprint
  6. C++(14)--面向对象
  7. cmw500综合测试仪使用_网络性能测试仪该怎么选
  8. 可以记录阅读进度的 pdf 电脑阅读器
  9. java 加载spring_spring的加载机制?
  10. 极简主义︱使用Turicreate进行快速图像分类迁移训练与预测(六)
  11. c++删除文件delete_关于macos删除快捷键,你知道这些区别用法吗?
  12. 用swing开发 震撼的CSDN用户关系图(转)和基于JMF的java rpg入门游戏
  13. C# Gooflow+layer弹出层 全js代码
  14. PHP自学---黑马程序员笔记【持续更新】
  15. 娃哈哈的困境,宗庆后的难题
  16. 了解MVP(最小可行产品) - 以及为什么我更喜欢最早的可测试/可用/可爱
  17. 手把手教你如何实现一个简单的数据加密算法
  18. iOS面试备战-网络篇
  19. linux网络与防火墙
  20. ubuntu中如何运行exe文件

热门文章

  1. Matlab之时间转字符串函数datestr
  2. 布局大数据 编织“智慧云”
  3. 得到-薛兆丰的北大经济学课-4-价格的作用
  4. Advances in Graph Neural Networks笔记4:Heterogeneous Graph Neural Networks
  5. syzkaller 源码阅读笔记2(syz-manager)
  6. 测试5年从中兴 15K 跳槽去腾讯 32K+16,啃完这份笔记你也可以
  7. 2023 聚合易支付系统开源源码
  8. 我的ON BEACH生活 ———捡贝壳(二)
  9. OKR 和项目管理之间的紧张关系
  10. 【STC8A8K64S4A12开发板】—开始做 定时器/计数器 实验啦