1、判斷鏈路是否存在回環?
(1)回環定義:
1-2-3-4-5-6-7
| |
----8
如上事例,則表示存在回環。
(2)求解思想:
說明:使用快慢指針,慢指針每次只前進一步,快指針每次前進兩步,直到慢指針遇上快指針。
2、貼上代碼
(1)數據結構定義
1 #ifndef LINKLIST_H
2 #define LINKLIST_H
3
4 #define NULL 0
5
6 typedef struct MyNode
7 {
8 int data;
9 struct MyNode* next;
10 };
11
2 #define LINKLIST_H
3
4 #define NULL 0
5
6 typedef struct MyNode
7 {
8 int data;
9 struct MyNode* next;
10 };
11
12 #endif
(2)判斷函數isExistLookBackUp(MyNode *node),如果存在就返回true,否則返回false.
1 #ifndef LINKLIST_BACK_H
2
#define LINKLIST_BACK_H
3 #include " LinkedList.h "
4 bool isExistLookBackUp(MyNode* node)
5 {
6 if(node == NULL || node->next == NULL)
7 return false;
8 MyNode* first = node;
9 MyNode* second = node->next->next;
10 while ( true)
11 {
12 if(second == NULL || second->next == NULL)
13 break;
14 if(first == second)
15 return true;
16 first=first->next;
17 second = second->next->next;
18 }
19 return false;
20 }
21
22 #endif // !LINKLIST_H
3 #include " LinkedList.h "
4 bool isExistLookBackUp(MyNode* node)
5 {
6 if(node == NULL || node->next == NULL)
7 return false;
8 MyNode* first = node;
9 MyNode* second = node->next->next;
10 while ( true)
11 {
12 if(second == NULL || second->next == NULL)
13 break;
14 if(first == second)
15 return true;
16 first=first->next;
17 second = second->next->next;
18 }
19 return false;
20 }
21
22 #endif // !LINKLIST_H
3、測試用例與運行結果
1 void Test3()
2 {
3 MyNode* node1,*node2,*node3,*node4,*node5,*node6,*node7;
4 node1 = new MyNode();
5 node2 = new MyNode();
6 node3 = new MyNode();
7 node4 = new MyNode();
8 node5 = new MyNode();
9 node6 = new MyNode();
10 node7 = new MyNode();
11
12 node1->data = 1;
13 node2->data = 2;
14 node3->data = 3;
15 node4->data = 4;
16 node5->data = 5;
17 node6->data = 6;
18 node7->data = 6;
19
20 node1->next = node2;
21 node2->next = node3;
22 node3->next = node4;
23 node4->next = node5;
24 node5->next = node6;
25 node6->next = node1;
26
27 node7->next = 0;
28
29 bool flag = isExistLookBackUp(node1);
30 printf( " %d\n ",flag);
31 }
3 MyNode* node1,*node2,*node3,*node4,*node5,*node6,*node7;
4 node1 = new MyNode();
5 node2 = new MyNode();
6 node3 = new MyNode();
7 node4 = new MyNode();
8 node5 = new MyNode();
9 node6 = new MyNode();
10 node7 = new MyNode();
11
12 node1->data = 1;
13 node2->data = 2;
14 node3->data = 3;
15 node4->data = 4;
16 node5->data = 5;
17 node6->data = 6;
18 node7->data = 6;
19
20 node1->next = node2;
21 node2->next = node3;
22 node3->next = node4;
23 node4->next = node5;
24 node5->next = node6;
25 node6->next = node1;
26
27 node7->next = 0;
28
29 bool flag = isExistLookBackUp(node1);
30 printf( " %d\n ",flag);
31 }
測試結果與說明:
說明:此處僅僅是簡單測試,具體應用時應該需要釋放內存空間。