链表是否有环
来源:互联网 发布:科比04年总决赛数据 编辑:程序博客网 时间:2024/05/20 11:51
转载自:http://blog.csdn.net/wangshihui512/article/details/9034157。
有环的链表指的是链表有环路,例如下面:A->B->C->D->B,这样遍历的时候B->C->D->B就形成一个环路一直循环。
#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. *****************************************/
阅读全文
0 0
- 链表是否有环
- 链表是否有环
- 链表是否相交,链表是否有环问题
- 判断链表是否有环及两链表是否相交
- 简单算法 - 链表是否有环-两链表是否相交
- 判断链表是否有环及两链表是否相交
- 判断链表是否有环及两链表是否相交
- 判断链表是否有环
- 判断链表是否有环
- 如何判断链表是否有环
- 判断链表是否有环
- 判断链表是否有环
- 判断一个链表是否有环
- 单向链表判断是否有环
- 判断链表是否有环
- 判断一个链表是否有环
- 判断链表是否有环
- 算法-判断链表是否有环
- linux内核驱动---创建设备节点文件
- 5-1 二分查找法
- IR2101驱动
- River Hopscotch
- 5-2 二分搜索树基础
- 链表是否有环
- 重写equals 和 hashCode
- Sourcetree的分支创建与合并
- 手写体数字识别(二) 训练图片提取 文档
- 第三周项目1
- XCode代码格式化插件
- Centos7.3安装和配置Mysql5.7
- 算法设计与复杂性理论 第一次上机 仙岛求药
- 单例模式详解JAVA语言描述