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 }
测试结果与说明:
说明:此处仅仅是简单测试,具体应用时应该需要释放内存空间。