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++)

template Node *SingleLinkedList::getLoopEntrance() { Node *slow = head, *fast = head; while (fast ...
  • chimomo
  • chimomo
  • 2012年06月30日 22:32
  • 27187

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

一、单链表环的定义: 有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D。 题目:0.如何判断单链表里面是否有...
  • lanmolei814
  • lanmolei814
  • 2015年03月29日 22:45
  • 1440

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

问题:判断一个单链表是否有环,如果有,找出环的起始位置。 分析: 是否有环 方法一:我们可以从单链表Head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候...
  • yuchenglian_happy
  • yuchenglian_happy
  • 2016年09月01日 09:18
  • 425

判断一个单链表是否有环

用快慢指针法,慢指针一次走一步,快指针一次走两步,如果有环必定相遇 这里给出C++和Python 版 Python: """ Definition of ListNode class Lis...
  • susser43
  • susser43
  • 2015年04月19日 14:01
  • 992

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

今天的内容主要包括三部分,RT。 1。判断链表是否带环 判断链表是否带环,我们可以采用在头结点设两个指针,一个叫fast,一个叫slow,fast一下走两步,而slow一下走一步。如果链表...
  • XIAXIA__
  • XIAXIA__
  • 2014年02月17日 21:54
  • 3886

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

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

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

快慢指针算法描述定义两个指针slow, fast。slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一次会再某一个时刻追上快指针(slow == fast)。如果没有环...
  • tracker_w
  • tracker_w
  • 2015年08月01日 13:24
  • 3055

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

#include #include typedef struct LinkNode { struct LinkNode* next; int data; }LinkList; /*...
  • yuanwei1314
  • yuanwei1314
  • 2015年01月24日 08:26
  • 1501

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

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

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

http://blog.csdn.net/gukesdo/article/details/7516021 首先如何判断一个链表是否有环: 设置两个指针(fast, slow),初始值都...
  • imxiaosong
  • imxiaosong
  • 2015年04月08日 15:49
  • 4749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++经典面试题之判断链表是否有环
举报原因:
原因补充:

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