没办法转载,只能粘贴,我错了。。来自 半个灵魂 http://my.youkuaiyun.com/zhaom_916/code/detail/702
在链表里如何发现循环链接
C++代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include <stdio.h>
#include <malloc.h>
#define TEST
struct
list_node
{
int
data;
list_node * next;
};
list_node *head;
//指向头结点
void
list_create()
{
int
i;
list_node *p=NULL;
head = (list_node*)
malloc
(
sizeof
(list_node));
head->data=0;
//头结点数据设为
head->next = NULL;
p=head;
for
(i=1; i<6; i++)
//创建个结点
{
p->next = (list_node*)
malloc
(
sizeof
(list_node));
p->next->data = i;
p->next->next = NULL;
p=p->next;
}
p->next = head;
//使尾结点的下一个结点指针指向头结点,构成循环链表
#ifdef TEST
p=head;
for
(i=0; i<12&&p!=NULL; i++)
{
printf
(
"%d "
,p->data);
p=p->next;
}
printf
(
"n"
);
#endif
}
void
cycleList_test()
{
if
(head==NULL || head->next == NULL || head->next->next == NULL)
return
;
list_node *p=NULL,*pp=NULL;
p=head;
pp=head->next->next;
while
(p!=pp )
{
p=p->next;
pp=pp->next->next;
if
(p==NULL || pp==NULL)
{
printf
(
"不是循环链表"
);
return
;
}
}
printf
(
"是循环链表"
);
}
void
list_destroy()
{
list_node *pmove=NULL,*pdel=NULL;
pmove=head->next;
while
(pmove!=head)
{
pdel=pmove;
pmove=pmove->next;
free
(pdel);
}
free
(head);
}
int
main()
{
list_create();
//构建循环链表
cycleList_test();
//测试是否是循环链表
list_destroy();
//销毁链表
return
0;
}
|
描述:分析:可以构建两个迭代器p和pp,p一次向移动一个节点,pp一次移动两个节点,如果p和pp在某个时刻指向了同一个节点,那么该链表就有循环链接。