Linknode * createLink( int n ) { int xValue; Linknode *head,*p,*pre; cout<<"請輸入第1個數字: "; cin>>xValue; p=(Linknode*)malloc(sizeof(Linknode)); //p=new Linknode; p->data=xValue; p->next=NULL; head=p; pre=p; for(int i=1;i<n;i++) { cout<<"請輸入第"<<i+1<<"個數字: "; cin>>xValue; p=(Linknode*)malloc(sizeof(Linknode)); p->data=xValue; if(i==n-1) { /*cout<<"已經組成一個環了!"<<endl;*/ p->next=head->next; } else { p->next=NULL; } pre->next=p; pre=p; } //printLink(head); return head; }
Linknode * findFirstCycleNode( Linknode *head ) { assert(head!=NULL&&head->next!=NULL); Linknode *pStart,*pCur; pCur=head; int nCur=0,nStart; //檢查每一個結點,若是 null退出,不是一個環。 while(pCur!=NULL) { pStart=head; nStart=0; while(pStart!=NULL) { if(pStart==pCur) { if(nStart==nCur) { break; } else //找到環的入口處了。 { cout<<"找到了,在第"<<nStart+1<<"節點處"<<endl; return pStart; } } nStart++; pStart=pStart->next; } nCur++; pCur=pCur->next; } cout<<"該鏈表不是一個環!"<<endl; return NULL; }
Linknode * findFirstCycleNode2( Linknode *head ) { assert(head!=NULL&&head->next!=NULL); set<Linknode*> addLinkNode; Linknode *pCur=head; while(pCur!=NULL) { if(addLinkNode.find(pCur)==addLinkNode.end()) { addLinkNode.insert(pCur); pCur=pCur->next; } else { cout<<"該鏈表是一個環!"<<endl; return pCur; } } cout<<"該鏈表不是一個環!"<<endl; return NULL; }
測試代碼
Linknode *headNode; int n; cout<<"請輸入創建的鏈表的長度"<<endl; cin>>n; headNode=createLink(n); //findFirstCycleNode(headNode); findFirstCycleNode2(headNode);