判断链表中是否存在循环
2013-08-12 17:15
302 查看
#include <stdio.h> #include <stdlib.h> typedef struct _node { int data; struct _node* next; }node,*list; /*问题:如何判断一个单向链表是否存在循环? 这个问题很经典。 有两种方法来判断: 算法一:该算法使用步长法判断链表是否存在循环, 即设两个遍历,第一个遍历步长是第二个遍历的步长的两倍,如果这两个遍历相遇(遍历到统一个结点),则单链表有回路。*/ bool FindLoop(node* head) { node *p,*q; if(NULL == head) return 0; p = head; q = head->next; while(q!=NULL && q->next!=NULL && p!=q) { p = p->next; q = q->next->next; } if(p==q) return true; else return false; } /*上面算法能过判断是否含有循环,但是它不能准确判断循环出现的位置。于是便有了算法2。 算法2不仅能够判断链表中是否含有循环,还能找出循环出现的具体位置。 算法2:当链表里当前的node的下一个node不是前面的任何一个node(包括自己),那么这个链表就不是循环链表*/ node *FindLoop2(node* head) { node *pc = head; node *pf = NULL; if(!pc) return NULL; while(pc) { pf = head; while(pf && pf!=pc) { /*当前结点的下一个结点是它前面的某个结点或者是它自己,则为循环处。*/ if(pc->next == pf || pc->next == pc) return pf; pf = pf->next; } pc = pc->next; } return NULL; }
相关文章推荐
- leetcode 判断简单链表是否存在循环
- [算法练习FindLoop]判断单向链表是否存在循环/循环入口/环长度
- Linked List Cycle 判断一个链表是否存在回路(循环)
- 笔试笔记————判断单向链表是否存在循环
- 单向链表判断是否存在循环
- 判断链表中是否存在循环
- 单向链表判断是否存在循环的经典方法
- 如何判断一个单向链表是否存在循环的经典方法
- Linked List Cycle-- 判断一个单向链表中是否有环存在
- 判断链表是否存在环和判断两个链表是否相交
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 如何判断单链表是否存在环 & 判断两链表是否相交
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断链表中是否有环存在
- 检测链表中是否存在循环
- 判断链表是否存在环路,并找出回路起点
- 判断单链表是否存在环,判断两个链表是否相交问题详解(zz)
- 判断单项链表是否存在环
- 判断两个单向链表是否存在环
- 判断单链表是否存在环,判断两个链表是否相交问题详解