题目:如何检测一个链表是否存在循环。
注:链表的节点数未知
解:
思路:用一个指针,遍历该链表。
每遍历到一个节点的时候,用另一个指针从头开始遍历。
第二个指针每到一个节点的时候,检查两个指针是不是指向了同一个节点。同时记录当前遍历了的节点个数。(第一次指向同一个节点说明第二个指针赶上了第一个指针,第二次指向同一个节点才说明第二个指针,超过第一个指针以后,又返回来追上了第一个指针,这就说明连表里存在循环。),这里用被遍历的节点个数标记是第几次指向同一个节点。
- //代码摘自:
- struct list{
-
int data;
-
struct list *next;
-
};
-
int has_circle(struct list *head)
-
{
-
struct list *cur1 = head;
-
int pos1 = 0;
-
while(cur1){
-
struct list *cur2 = head;
-
int pos2 = 0;
-
pos1 ++;
-
while(cur2){
-
pos2 ++;
-
if(cur2 == cur1){
-
if(pos1 == pos2)
-
break;
-
else
-
return 1; //has circle
-
}
-
cur2 = cur2->next;
-
}
-
cur1 = cur1->next;
-
}
-
return 0;
-
}
阅读(859) | 评论(0) | 转发(0) |