判断单链表中是否存在环(网上说的笔试题)
【正确答案】#include "stdafx.h"
typedef char eleType; // 定义链表中的数据类型
typedef struct listnode // 定义单链表结构
{
eleType data;
struct listnode *next;
}node;

node *create(int n) // 创建单链表,n为节点个数
{
node *p = (node *)malloc(sizeof(node));
node *head = p; head->data = 'A';
for(int i='B'; i<'A'+n; i++)
{
p = (p->next = (node *)malloc(sizeof(node)));
p->data = i;
p->next = NULL;
}
return head;
}

void addCircle(node *head, int n) // 增加环,将链尾指向链中第n个节点
{
node *q, *p = head;
for(int i=1; p->next; i++)
{
if(i==n) q = p;
p = p->next;
}
p->next = q;
}

int isCircle(node *head) // 这是笔试时需要写的最主要函数,其他函数可以不写
{
node *p=head,*q=head;
while( p->next && q->next)
{
p = p->next;
if (NULL == (q=q->next->next)) return 0;
if (p == q)
return 1;
}
return 0;
}

int main(int argc, char* argv[])
{
node *head = create(12);
addCircle(head, 8); // 注释掉此行,连表就没有环了
printf("%d/n", isCircle(head));
return getchar();
}
【答案解析】