给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct listnode)
typedef struct listnode{
int data;
struct listnode *next;
}listnode,*linklist;
int main()
{
linklist creathuan(),l;
int m,pos,cycle(linklist p);
printf("输入pos的值:");
scanf("%d",&pos);
printf("创造环形链表:");
l=creathuan(pos);
printf("输出1为链表有环,输出0为链表没有环\n");
m=cycle(l);
printf("The answer:%d",m);
return 0;
}
int cycle(linklist l) //因为C语言没有BOOL型,因此这里我用整形代替,0代表false,1代表true
{
if (l==NULL || l->next == NULL)
return 0;
linklist fast=l->next,slow=l;
while(slow!=fast)
{
if(fast==NULL||fast->next==NULL)
return 0;
fast=(fast->next)->next;
slow=slow->next;
}
return 1;
}
linklist creathuan(int pos)
{
linklist l=(linklist)malloc(sizeof(LEN));
int x;
linklist r=l,s,t;
scanf("%d",&x);
while(x!=9999)
{
s=(linklist)malloc(sizeof(LEN));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
t=l->next; //如果设t=l->next那么会有pos=1与pos=0时情况相同,因为结点l不存在值,因此这么写
if(pos==-1)
{
r->next=NULL;
return l->next;
}
else if(pos==0)
{
r->next=l->next;
return l->next;
}
else
{
while(pos)
{
pos--;
t=t->next;
}
r->next=t;
return l->next;
}
}