计算一个单项链表(链表中有环)中环的长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算一个单项链表(链表中有环)中环的长度相关的知识,希望对你有一定的参考价值。

    这个方法用到了快指针和慢指针,他俩从头结点一起跑,每次快指针走两个节点,慢指针走一个节点,当进入环之后,快指针终会追上慢指针。这时,记录相遇的节点,然后让慢指针再跑一圈就可以测出环的长度了。

    这个方法适用于任何情况,无论整个链表都是环,还是环的节点只有一个的。


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

typedef struct node
{
    int num;
    struct node* next;
}NODE;

NODE* create(NODE* phead,int nu)
{
    NODE* tmp = malloc(sizeof(struct node));
    tmp->num = nu;
    NODE* find = phead;
    if(phead == NULL){
        return tmp;
    }
    else{
        while(find->next != NULL)
            find = find->next;
        find->next = tmp;
        return phead;
    }
}

void show(NODE* phead)
{
    int i=0;
    while(i<25){
        printf("%d ",phead->num);
        phead = phead->next;
        i++;
    }
    printf("\n");
#if 0
    while(phead){
        printf("%d ",phead->num);
        phead = phead->next;
    }
    printf("\n");
#endif
}

void createring(NODE* phead, NODE* point)
{
    while(phead->next != NULL)
        phead = phead->next;
    phead->next = point;
}

NODE* point(NODE* phead)
{
    while(phead->next != NULL)
        phead = phead->next;
    return phead;
}

void check(NODE* phead)
{
    NODE* quick = phead;
    NODE* slow = phead;
    NODE* point;
    int num = 0;    
    while(1){
        quick = quick->next->next;    //快指针一次走两个
        slow = slow->next;        //慢指针一次走一个
        if(slow == quick){        
            point = slow;
            point = point->next;    //记录当两个指针相遇时的位置,从这个位置开始计数,当指针转一圈时结束
            num++;    
            while(slow != point){
                point = point->next;
                num++;
            }
            printf("the ring long is: %d\n",num);
            break;
        }

    }
}

int main(void)
{
    NODE* head;
    NODE* tail;
    NODE* poin;
    NODE* head1;
    head = create(head,21);
    create(head,22);
    create(head,23);
    create(head,24);
    create(head,25);
    create(head,26);
    poin = point(head);    //记录从环开始的节点
    create(head,27);
    create(head,28);
    create(head,29);
    create(head,30);
    create(head,31);
    create(head,32);
    create(head,33);
    createring(head,poin);    //让尾节点指向环开始的节点
    check(head);
//    show(head);
    return 0;
}

以上是关于计算一个单项链表(链表中有环)中环的长度的主要内容,如果未能解决你的问题,请参考以下文章

*链表中环的入口结点

双100%解法LeetCode 141 剑指Offer 23链表中环的入口节点

双100%解法LeetCode 141 剑指Offer 23链表中环的入口节点

剑指Offer - 面试题23:链表中环的入口节点

如果单链表有环,求环的起始位置

数据结构与算法之深入解析如何确定单链表有环并求环的入口和长度