链表是否是环链

来源:互联网 发布:linux 解压命令 zip 编辑:程序博客网 时间:2024/06/06 02:37

搜东西的时候看到的,自己看了看别人的讨论,写了个方法。

基本思想:申明两个临时指针,一个一次走一步,一个一次走两步,看最后是否能够相等,如果有环,肯定会出现相等的情况;没有环,应该能够正常结束。

定义一个结构体:

typedef struct node{int info;struct node* next;}LINKLIST;

查找方法:
bool findCircle(LINKLIST *begin){if(begin == NULL || begin->next ==NULL){return false;}if(begin->next == begin){return true;}LINKLIST *first, *second;first = begin;second = begin->next->next;while( first != second && second != NULL && second->next !=NULL){first = first->next;second = second->next->next;}if(first == second){return true;}return false;}

方法有点笨,主要是一个要先走两步,一个后走一步。

最后写个main测试下:

int main(){LINKLIST A;LINKLIST B;LINKLIST C;LINKLIST D;A.info = 1;B.info = 2;C.info = 3;D.info = 4;LINKLIST* p = NULL;p = &A;LINKLIST* q = NULL;q = &A;A.next = &B;B.next = &C;C.next = &D;D.next = NULL;if(findCircle(&A)){printf("链表中有环");}else{printf("链表中没有环");}}
这个是没有环的,最后能输出“链表中没有环”;修改D.next = &B,这样会输出“链表中有环”;

csdn上讨论的网址:http://topic.csdn.net/t/20061112/15/5151874.html