思路:设置快慢指针,如果链表带环的话,两个指针一定会指向同一个结点的,因为是单向链表,所以只可能是尾部带环。
代码实现
运行环境VS2017
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
int Long(ElemSN*h1,ElemSN*h2)
{
ElemSN*p=h1, *q=h2;
while (q&&q->next)
{
p = p->next;
q = q->next->next;
if (q == p)
return 1;
}
return 0;
}
int main(void)
{
int i;
int a1[5] = { 3,2,3,4,1 };
int a2[5] = { 5,6,7,8,9 };
ElemSN*head1, *head2;
head1 = GreatLink(a1, 5);
head2 = GreatLink(a2, 5);
PrintLink(head1);
PrintLink(head2);
i = Long(head1, head2);
printf("%d\n", i);
system("pause");
}
输出结果
3 2 3 4 1
5 6 7 8 9
0