數據結構——6 單鏈表是否是環形鏈表

單鏈表——是否是環形鏈表


單鏈表,判斷鏈表是否是環形鏈表

#include<iostream>
using namespace std;
struct node       //node結構體,裏面有一個node指針,用來指向下一個node對象
{
	int x;
	node *next;   //指向什麼類型的對象,就用什麼類型的指針
};

node* create(int n)         //創建鏈表,參數n表示結點的個數,返回類型是結點指針node*
{
	node *head=new node;    //建立頭結點
	node *p=head;           //創建用於往後指的node指針


	for(int i=0;i<n;i++)
	{
		node *temp=new node;     //new一個node指針
		temp->x=rand()%100;
		p->next=temp;            //將p的next指向創建的temp,把新節點連接到鏈表後面
		p=temp;                  //將p指向新結點temp,即p移動到下一個節點
	}
	p->next=NULL;                    //創建完成後,p->next指向NULL
//	p->next=head->next;              //創建完成後,首位連接,組成環形鏈表 


	return head;
}

void display(node *head)             //輸出鏈表
{
	node *p;
	p=head->next;                //p重新指向頭結點後的那個結點,即for循環創建的第一個結點
	if(p==NULL)
		cout<<"NULL List";
	while(p!=NULL)               //輸出
	{
		cout<<p->x<<"  ";
		p=p->next;
	}
	cout<<endl;
}

/*
比較的思想是:p2比p1跑的快,如果有環形,那麼多次循環後p2會追上p1
*/
bool isloop(node *head)
{
	node *p1,*p2;            //定義node指針變量
	p1=head->next;           //p1指向第一個結點,p2指向第二個結點
	p2=head->next->next;


	bool flag=false;         //標記位置0,默認不是環形鏈表
	while( p1 && p2 && p2->next!=NULL )
	{              
		if(p1==p2)   //如果兩個結點地址一樣,則表示有環形,標準位置1
		{
			flag=1;
			break;
		}
	p1=p1->next;             //p1指向下一個
	p2=p2->next->next;       //p2指向下一個的下一個
	}


	return flag;
}

int main()
{
	node *list; 
	list=create(8);            //建立鏈表
//	display(list);             //輸出顯示建立的鏈表
cout<<	isloop(list)<<endl;
// 	display(list);             //輸出排序後的鏈表
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章