判断单链表是否是有环链表两种方式(尾指针不指向第一个节点)
//判断是否是有环的链表两种方法 //1.利用步数,定义两个指针1和2,再计算两个指针的步数,一个指针是每次都从头开始计数,一个指针是连续计数,如果在同一个位置但是步数不同则有环; #include <stdio.h> typedef struct Node{ int data; struct Node *Next; }Node; int judge(Node *L){ Node* cur1=L; int pos1=0; while(cur1){//这个循环条件设置原因:如果是无环链表那么尾指针必定为空,如果是有环链表那么不会退出循环,直到找到环的位置后返回1; int pos2=0; Node *cur2=L; while(cur2){ if(cur1==cur2){ if(pos1==pos2){ break; } else{ printf("环的位置在第%d个位置",cur1); return 1; } } cur2=cur2->Next; pos2++; } pos1++; cur1=cur1->Next; } } //2.利用快慢指针,定义两个指针,一个指针一次走一个节点,一个指针一次走2个点,如果他们相遇了,那么就有环,否则就没有; int judgeTwo(Node *L){ Node *p=L; Node *q=L; while(p&&q&&q->Next){ p=p->Next; if(q->Next){ q=q->Next->Next; } printf("p:%d,q:%d",p->data,q->data); if(p==q) return 1; } return 0; } int main(){ }
步数判断法图片解析:

此时链表6到3需要步数为7,而1到3只要2,它们不等,所以有环;
浙公网安备 33010602011771号