# C/C++经典面试题之判断链表是否有环

#include <cstdio>

typedef struct list
{
int data;
struct list *next;
}LIST;

/* Method 1: check the occurrence of p->next from head to p */
{
LIST *p = head, *q= NULL;

if (p == NULL)
return false;

while (p->next)
{
/* check whether p points to itself */
if (p->next == p)
{
return true;
}

/* check the occurrence of p->next in head to p */
while (q != p)
{
if (q == p->next)
{
return true;
}
q = q->next;
}
p = p->next;
}
/* p->next is NULL, not a circle */
return false;
}

/* Method 2: q goes faster than p, if at last p == q, means there's circle */
/* 优点：逻辑上简单。 缺点：无法具体知道从哪个点拆开该圈 */
{
LIST *p, *q;

if (p == NULL)
return false;

q = p->next;

while (p != NULL && q != NULL)
{
if (p == q)
{
return true;
}
p = p->next;
if (q->next == NULL)
{
return 0;
}
else
{
q=q->next->next;
}
}
return 0;
}
void testIS()
{
LIST a, b, c, *head = &a;
a.next = &b;
b.next = &c;
c.next = &a;
printf("1:is circle | 0:not circle || result check_circle_1(head):\
printf("1:is circle | 0:not circle || result check_circle_1(head):\
}
void testNO()
{
LIST a, b, c, *head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
printf("1:is circle | 0:not circle || result check_circle_1(head):\
printf("1:is circle | 0:not circle || result check_circle_1(head):\
}
int main()
{
printf("-------testIS()--------\n");
testIS();
printf("-------testNO()--------\n");
testNO();
}
/****************************************

-------testIS()--------
1:is circle | 0:not circle || result check_circle_1(head):        1
1:is circle | 0:not circle || result check_circle_1(head):        1
-------testNO()--------
1:is circle | 0:not circle || result check_circle_1(head):        0
1:is circle | 0:not circle || result check_circle_1(head):        0

Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.

*****************************************/



#include <cstdio>

typedef struct list
{
int data;
struct list *next;
}LIST;

/* Method 1: check the occurrence of p->next from head to p */
{
LIST *p = head, *q= NULL;

if (p == NULL)
return false;

while (p->next)
{
/* check whether p points to itself */
if (p->next == p)
{
return true;
}

/* check the occurrence of p->next in head to p */
while (q != p)
{
if (q == p->next)
{
return true;
}
q = q->next;
}
p = p->next;
}
/* p->next is NULL, not a circle */
return false;
}

/* Method 2: q goes faster than p, if at last p == q, means there's circle */
/* 优点：逻辑上简单。 缺点：无法具体知道从哪个点拆开该圈 */
{
LIST *p, *q;

if (p == NULL)
return false;

q = p->next;

while (p != NULL && q != NULL)
{
if (p == q)
{
return true;
}
p = p->next;
if (q->next == NULL)
{
return 0;
}
else
{
q=q->next->next;
}
}
return 0;
}
void testIS()
{
LIST a, b, c, *head = &a;
a.next = &b;
b.next = &c;
c.next = &a;
printf("1:is circle | 0:not circle || result check_circle_1(head):\
printf("1:is circle | 0:not circle || result check_circle_1(head):\
}
void testNO()
{
LIST a, b, c, *head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
printf("1:is circle | 0:not circle || result check_circle_1(head):\
printf("1:is circle | 0:not circle || result check_circle_1(head):\
}
int main()
{
printf("-------testIS()--------\n");
testIS();
printf("-------testNO()--------\n");
testNO();
}
/****************************************

-------testIS()--------
1:is circle | 0:not circle || result check_circle_1(head):        1
1:is circle | 0:not circle || result check_circle_1(head):        1
-------testNO()--------
1:is circle | 0:not circle || result check_circle_1(head):        0
1:is circle | 0:not circle || result check_circle_1(head):        0

Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.

*****************************************/

• 本文已收录于以下专栏：

## 数据结构 - 如何找到有环单链表的环的入口位置（C++）

• chimomo
• 2012年06月30日 22:32
• 27187

## 题目：代码实现判断单链表是否有环

• lanmolei814
• 2015年03月29日 22:45
• 1440

## 笔试题：判断一个单链表是否有环，如果有，找出环的起始位置

• yuchenglian_happy
• 2016年09月01日 09:18
• 425

## 判断一个单链表是否有环

• susser43
• 2015年04月19日 14:01
• 992

## 判断链表是否有环，求环的入口点及环长

• XIAXIA__
• 2014年02月17日 21:54
• 3886

## LeetCode -- 判断链表中是否有环

LeetCode -- 判断链表中是否有环
• csharp25
• 2015年07月23日 19:46
• 1320

## 判断单向链表中是否有环和查找环的入口

• tracker_w
• 2015年08月01日 13:24
• 3055

## 判断链表是否成环，如果成环返回成环的第一个结点

• yuanwei1314
• 2015年01月24日 08:26
• 1501

## Java判断单链表是否有环的两种实现方法

package demo6;import java.util.HashMap;import demo6.LinkReverse2.Node; /** * 判断链表是否有环的方法 * @author...
• JQ_AK47
• 2016年10月05日 17:18
• 6579

## 首先如何判断一个链表是否有环，并找出环的入口

http://blog.csdn.net/gukesdo/article/details/7516021 首先如何判断一个链表是否有环： 设置两个指针(fast, slow)，初始值都...
• imxiaosong
• 2015年04月08日 15:49
• 4749

举报原因： 您举报文章：C/C++经典面试题之判断链表是否有环 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)