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

原创 2013年06月05日 21:28:35
#include <cstdio>

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

/* Method 1: check the occurrence of p->next from head to p */
bool check_circle_1(LIST *head)
{
    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 */
        q = head;
        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 */
/* 优点:逻辑上简单。 缺点:无法具体知道从哪个点拆开该圈 */
bool check_circle_2(LIST *head)
{
    LIST *p, *q;
    p = head;

    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):\
        %d\n", check_circle_1(head));
    printf("1:is circle | 0:not circle || result check_circle_1(head):\
        %d\n", check_circle_2(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):\
        %d\n", check_circle_1(head));
    printf("1:is circle | 0:not circle || result check_circle_1(head):\
        %d\n", check_circle_2(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 */
bool check_circle_1(LIST *head)
{
    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 */
        q = head;
        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 */
/* 优点:逻辑上简单。 缺点:无法具体知道从哪个点拆开该圈 */
bool check_circle_2(LIST *head)
{
    LIST *p, *q;
    p = head;

    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):\
        %d\n", check_circle_1(head));
    printf("1:is circle | 0:not circle || result check_circle_1(head):\
        %d\n", check_circle_2(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):\
        %d\n", check_circle_1(head));
    printf("1:is circle | 0:not circle || result check_circle_1(head):\
        %d\n", check_circle_2(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++实现

单向循环链表的C++实现

蓄水池抽样(Reservoir sampling)解决在不知道样本容量的情况下随机抽取一个或多个元素的问题

(转)蓄水池抽样(Reservoir sampling)解决在不知道样本容量的情况下随机抽取一个或多个元素的问题...

在第一个字符串中删除在第二个字符串中出现的所有字符

从第一字符串中删除第二个字符串中所有的字符,例如第一个字符串“We are students.”,第二个字符串“aeiou”,则删除后的结果为“W r stdnts.”。通过文章知道,我们可以通过ha...

C/C++面试题(2)——查找链表中倒数第k个数

思路是: 用两个指针,第一个指针先向前走k-1 步,然后两个指针一起走,当第一个指针走到尾节点的时候, 第二个指针指向的就是倒数第k个节点。 面试过程中最容易出现的不足: 忘记判断...

面试题一 C/C++面试秘笈之单链表的创建,增删改查及打印

/**面试题1  *编程实现一个单链表 */ typedef struct node{     int data;//节点内容     node * next;//下一个节点 }node; //创...

微软系列面试题c/c++第一题双向链表

先写的别的,近来学习算法和数据结构,有许多不懂的地方,借助代码提高一下自己的能力。在此,做个计划,每两天写一篇博客,解决一道微软面试题。打算一年之内完成系列博客的更新。也请大家多多探讨。也算是对自己的...

经典面试题之单链表找环

大概的题意是,给出一个单向链表的头节点,求这么链表是否有环。有环的定义是,链表的尾节点指向了链接中间的某个节点。单链表的定义如下: 1 2 3 4 str...

经典面试题:链表的相交与环问题

出处:http://blog.csdn.net/walkinginthewind/article/details/7074022   1.  给出两个单向链表的头指pHead1和pHead2,判断...

经典面试题:链表的相交与环问题

转自:http://blog.csdn.net/walkinginthewind/article/details/7074022 1.  给出两个单向链表的头指针pHead1和pHead2,...

【面试题】-判断单链表是否有环并找到环入口(快慢指针)

快慢指针 所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。 单链表环 单链表有环的定义是链表的尾节点指向了链表中间的某个...
  • zwhlxl
  • zwhlxl
  • 2015年05月14日 21:57
  • 1828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++经典面试题之判断链表是否有环
举报原因:
原因补充:

(最多只允许输入30个字)