当前位置:   article > 正文

链表是否存在环及环的个数_链表可以存在多个循环吗

链表可以存在多个循环吗

判断链表中是否存在环,可以使用双重循环但是时间复杂度为O(n^2),经典做法就是采用快慢指针来解决该问题

如何确定链表中有环:

       设置p,q两个指针,p为慢指针,q为快指针,p每次向前移动一个结点,q每次向前移动两个结点,慢指针的作用就是为了保证遍历完所有的结点,而快指针的作用就是为了当慢指针进入环中时,快速追上慢指针,达到确定链表中存在环的目的

  1. // 判断链表中是否有环
  2. int hasRing(LinkList *L) {
  3. LinkList *p;
  4. LinkList *q;
  5. while (p!= NULL && q != NULL && q->next != NULL) {
  6. p = p->next; //慢指针先走一步
  7. if(q->next != NULL) {
  8. q = q->next->next;
  9. }
  10. if(p == q) {
  11. return 1;
  12. }
  13. }
  14. return 0;
  15. }

如何确定环的长度:

       接上面的问题,p为慢指针,q为快指针,从第一次相遇的地方 继续进行“快指针”的遍历,此时快指针的步伐为一次一步,设置一个变量count来记录个数,当快慢指针再次相遇的时候,count的值就是环中结点的个数

  1. int getRingCount(LinkList *L) {
  2. LinkList *p;
  3. LinkList *q;
  4. while (p!= NULL && q!= NULL && q->next != NULL) {
  5. p = p->next; //慢指针走一步
  6. if(q->next != NULL) {
  7. q = q->next->next; //快指针走两步
  8. }
  9. if(p == q) {
  10. break;
  11. }
  12. }
  13. q = q->next;
  14. int count = 1; //因为快指针走了一次啦
  15. while (p != q) {
  16. q = q->next;
  17. count++;
  18. }
  19. return count;
  20. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/681911
推荐阅读
相关标签
  

闽ICP备14008679号