1. 程式人生 > >單鏈表是否有環,環的大小,第一個連線點,有環的單鏈表長度

單鏈表是否有環,環的大小,第一個連線點,有環的單鏈表長度

給定一個單鏈表,只給出頭指標h:
1、如何判斷是否存在環?
2、如何知道環的長度?
3、如何找出環的連線點在哪裡?
4、帶環連結串列的長度是多少?
下面是實現,可以相互檢查一下是否不正確。

/*
  2     Here we discuss four question about single list
  3     1. isCircle(ListNode* head)
  4     2. lenghtOfCircle_list(ListNode* head)
  5     3. firstNodeOfCircle(ListNode* head)
  6     4. lengthOfCircle(ListNode* head);
  7 */
8 struct ListNode{ 9 int val; 10 ListNode* next; 11 }; 12 bool isCircle(ListNode* head){ 13 14 if(head==NULL) 15 return false; 16 ListNode* slow=head; 17 ListNode* fast=head; 18 while(fast!=NULL){ 19 slow=slow->next; 20 if(fast->next!=
NULL) 21 fast = fast->next->next; 22 if(slow==fast) 23 return true; 24 } 25 return false; 26 } 27 int lengthOfCircle(ListNode* head){ 28 if(head==NULL) 29 return 0; 30 int result=0; 31 ListNode* slow=head; 32 ListNode* fast=
head; 33 while(fast!=NULL){ 34 slow=slow->next; 35 if(fast->next!=NULL) 36 fast = fast->next->next; 37 if(slow==fast){ 38 //conflict node, 39 result++; 40 slow=slow->next; 41 fast=fast->next->next; 42 while(slow!=fast){ 43 slow=slow->next; 44 fast=fast->next->next; 45 result++; 46 } 47 return result; 48 } 49 } 50 return result; 51 } 52 ListNode* firstNodeOfCircle(ListNode* head){ 53 if(head==NULL) 54 return 0; 55 int result=0; 56 ListNode* slow=head; 57 ListNode* fast=head; 58 while(fast!=NULL){ 59 slow=slow->next; 60 if(fast->next!=NULL) 61 fast = fast->next->next; 62 if(slow==fast){ 63 //conflict node, 64 while(slow!=head){ 65 slow=slow->next; 66 head=head->next; 67 } 68 return head; 69 } 70 } 71 return NULL; 72 73 } 74 int lenghtOfCircle_list(ListNode* head){ 75 if(head==NULL) 76 return 0; 77 int result=lengthOfCircle(head); 78 if(result==0){ 79 //no circle 80 ListNode* node=head; 81 int res=0; 82 while(node!=NULL){ 83 node=node->next; 84 ++res; 85 } 86 return res; 87 } 88 ListNode* temp=firstNodeOfCircle(head); 89 ListNode* node=head; 90 int res=0; 91 while(temp!=node){ 92 res++; 93 node = node->next; 94 } 95 return res+lengthOfCircle(head); 96 }