单链表循环检测

  • 单链表中的循环

    • 如果链表带循环,从表头开始遍历,最终一定会进入链表循环中使得遍历过程无法适当停止。
  • 两质点在同一圆周内的运动

    • 假设两个质点在同一个圆周内沿相同方向作无休止的圆周运动,两质点速度恒定且不相同,则不论初始状态如何,两个质点总有一刻会撞到一起(实际上他们会无数次撞到一起)。
  • 代码实现
    根据以上两点,可以写出判断单链表中是否存在循环的代码,如下:

#include <stdio.h>

typedef struct node {
    struct node *next;
    int data;
} node_t;

int check_cycle(node_t *list)
{
    node_t *a = list, *b = list;

    while (b) {
        a = a->next;
        b = b->next;        

        if (!b) {
            break;
        }

        b = b->next;

        if (b == a) {
            return 1;
        }
    }

    return 0;
}

int main()
{
    int i;
    node_t list[100];

    for (i = 0; i < 100; i++) {
        list[i].next = &list[i+1];
    }

    list[99].next = &list[50];
    if (check_cycle(list)) {
        printf("list cycle detected!\n");
    } else {
        printf("list ok!\n");
    }

    list[99].next = NULL;
    if (check_cycle(list)) {
        printf("list cycle detected!\n");
    } else {
        printf("list ok!\n");
    }

    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 4,313评论 4 12
  • 概念 树是什么 树(Tree)是n(n>=0)个结点的有限集。 n = 0的树是空树。 在任意一棵非空树中: 有且...
    刚刚悟道阅读 5,152评论 1 16
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,484评论 1 3
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 1,545评论 0 6
  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,941评论 0 7