C/C++经典面试题之判断链表是否有环
2013-06-05 21:28
483 查看
#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++面试秘笈 之判断链表是否存在环形链表问题-程序员面试题
- 链表面试题3/链表带环问题--判断链表是否带环?
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 单向链表判断是否存在循环的经典方法
- 面试题---判断链表是否相交
- 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
- 面试题7:判断链表是否有环,返回环的入口点
- 链表面试题(九)---判断一个链表是否带环
- 【经典问题】判断单链表是否存在环,判断两个链表是否相交问题详解
- 234. Palindrome Linked List 判断链表是否回文(C++解决)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)
- 链表面试题之判断链表是否带环?若带环求环的长度?若带环求环的入口点?
- 单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点
- 链表面试题----判断一个单链表是否带环,若带环,求入口点和环的长度
- 链表面试题(十二)---判断两个都不带环的链表是否相交
- 经典算法 | 判断任意长度链表是否有环的O(n)时间,O(1)空间算法
- 常见链表面试题之判断链表是否相交,并求交点
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 面试题:判断单链表是否为循环链表-快慢指针