Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33902
  • 博文数量: 14
  • 博客积分: 255
  • 博客等级: 二等列兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-30 13:47
文章分类
文章存档

2011年(14)

我的朋友

分类: C/C++

2011-09-27 13:04:30

题目:如何检测一个链表是否存在循环。
注:链表的节点数未知

解:
   思路:用一个指针,遍历该链表。
每遍历到一个节点的时候,用另一个指针从头开始遍历。
第二个指针每到一个节点的时候,检查两个指针是不是指向了同一个节点。同时记录当前遍历了的节点个数。(第一次指向同一个节点说明第二个指针赶上了第一个指针,第二次指向同一个节点才说明第二个指针,超过第一个指针以后,又返回来追上了第一个指针,这就说明连表里存在循环。),这里用被遍历的节点个数标记是第几次指向同一个节点。

  1. //代码摘自:
  2. struct list{
  3.     int data;
  4.     struct list *next;
  5. };
  6. int has_circle(struct list *head)
  7. {
  8.     struct list *cur1 = head;
  9.     int pos1 = 0;
  10.     while(cur1){
  11.         struct list *cur2 = head;
  12.         int pos2 = 0;
  13.         pos1 ++;
  14.         while(cur2){
  15.             pos2 ++;
  16.             if(cur2 == cur1){
  17.             if(pos1 == pos2)
  18.                 break;
  19.             else
  20.                 return 1; //has circle
  21.             }
  22.             cur2 = cur2->next;
  23.         }
  24.         cur1 = cur1->next;
  25.     }
  26.     return 0;
  27. }
阅读(859) | 评论(0) | 转发(0) |
0

上一篇:Linux 命令学习

下一篇:本博声明

给主人留下些什么吧!~~