美文网首页
单链表循环检测

单链表循环检测

作者: wundead | 来源:发表于2016-02-23 21:41 被阅读103次
    • 单链表中的循环

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

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

    #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;
    }
    
    

    相关文章

      网友评论

          本文标题:单链表循环检测

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