判斷單鏈表是否是有環連結串列兩種方式(尾指標不指向第一個節點)
阿新 • • 發佈:2021-08-02
//判斷是否是有環的連結串列兩種方法 //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,它們不等,所以有環;