判断单链表是否是有环链表两种方式(尾指针不指向第一个节点)

//判断是否是有环的链表两种方法
//1.利用步数,定义两个指针1和2,再计算两个指针的步数,一个指针是每次都从头开始计数,一个指针是连续计数,如果在同一个位置但是步数不同则有环; 
#include <stdio.h>
typedef struct Node{
    int data;
    struct Node *Next;
}Node;
int judge(Node *L){
    Node* cur1=L;
    int pos1=0;
    while(cur1){//这个循环条件设置原因:如果是无环链表那么尾指针必定为空,如果是有环链表那么不会退出循环,直到找到环的位置后返回1;
        int pos2=0;
        Node *cur2=L;
        while(cur2){
            if(cur1==cur2){
                if(pos1==pos2){
                    break;
                }
                else{
                    printf("环的位置在第%d个位置",cur1);
                    return 1;
                }
            }
            cur2=cur2->Next;
            pos2++;
        }
        pos1++;
        cur1=cur1->Next;
    }
} 
//2.利用快慢指针,定义两个指针,一个指针一次走一个节点,一个指针一次走2个点,如果他们相遇了,那么就有环,否则就没有; 
int judgeTwo(Node *L){
    Node *p=L;
    Node *q=L;
    while(p&&q&&q->Next){
        p=p->Next;
        if(q->Next){
            q=q->Next->Next;
        }
        printf("p:%d,q:%d",p->data,q->data);
        if(p==q)
            return 1;
    }
    return 0;
}
int main(){
    
}

步数判断法图片解析:

 

 此时链表6到3需要步数为7,而1到3只要2,它们不等,所以有环;

posted @ 2021-08-02 17:02  不负韶华。  阅读(130)  评论(0)    收藏  举报