在链表里如何发现循环链接


没办法转载,只能粘贴,我错了。。来自 半个灵魂 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在某个时刻指向了同一个节点,那么该链表就有循环链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值