1. 程式人生 > >判斷一個單鏈表是否有環

判斷一個單鏈表是否有環

主函式中沒有出現具體的連結串列,主要看判斷有無環函式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;
}