判斷一個單鏈表是否有環
阿新 • • 發佈:2019-01-23
主函式中沒有出現具體的連結串列,主要看判斷有無環函式ExitLoop.
外函式的while迴圈條件的判定:如果fast指標指向NULL,if條件語句不成立,返回flag=0:不存在環。
如果flag走到最後一個結點時,要是不給定一個條件,while繼續執行,flag一次迴圈走兩步:flag=flag->next->next;這時flag->next已經為NULL,再加一個next就對NULL進行操作,編譯器就會報錯。所以while的迴圈條件要加上flag->next;
兩個條件中只要有一個為0,迴圈就退出,返回標誌flag。
#include <stdio.h>
//判斷單鏈表是否有環
int ExitLoop(Node *h)//將頭結點的地址傳過來
{
Node* slow = h;//慢指標
Node* fast = h;//快指標
int flag = 0;//設立標誌flag,預設flag=0為不存在環
while(fast || fast->next)//快指標指向空,不存在環
{
slow = slow->next;//慢指標走1步
fast = fast->next->next;//快指標走2步
if (slow == fast)//如果有環慢指標總會追上快指標
{
flag = 1;//flag=1為存在環
break;
}
}
return flag;
}
int main()
{
int flag;
Node* h =Creat();//假裝有個單鏈表
if(ExitLoop(h))//成立:ExitLoop返回1
{
printf("存在環\n");
}
else
{
printf("不存在環");
}
return 0;
}