#include<stdio.h>
#include<stdlib.h>
typedef struct Linklist
{
struct Linklist *next;
}Node;
Node* CreateLinklist(int n)
{
int i;
Node *head,*p,*q;
head=(struct Linklist*)malloc(sizeof(Node));
p=head;
for(i=0;i<n;i++)
{
q = (struct Linklist*)malloc(sizeof(Node));
p->next=q;
p=q;
}
// p->next=NULL;
// 单循环链表有环的情况
p->next=head;
return head;
}
/*******************************************************
有些题目要求:注意不能用标志位,最多只能用两个额外指针
其实也就是要求用下述方法进行解答:
使用两个指针,一个每次移动一步,另一个每次移动两步
如果单链表中存在环,那么他们必将会在环中相遇。
*******************************************************/
int IsRing(Node *head)
{
Node *p,*q;
if(head==NULL)
{
printf("Linklist is NULL!");
return;
}
p=head;
q=p->next;
while(p!=q&&p!=NULL&&q!=NULL)
{
p=p->next;
q=q->next->next;
}
if(p==q)
return 1;
else
return 0;
}
main()
{
Node *p;
p=CreateLinklist(10);
if(IsRing(p))
{
printf("The linklist have a ring!/n");
}
else
printf("The linklist no ring!/n");
}

4629

被折叠的 条评论
为什么被折叠?



