1. 程式人生 > 其它 >判斷單鏈表是否是有環連結串列兩種方式(尾指標不指向第一個節點)

判斷單鏈表是否是有環連結串列兩種方式(尾指標不指向第一個節點)

//判斷是否是有環的連結串列兩種方法
//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,它們不等,所以有環;