- struct list_node {
-
struct list_node *next;
-
void *data;
-
};
-
-
#define FALSE 0
-
#define TRUE 1
-
typedef unsigned char bool;
-
-
bool is_list_exist_loop(struct list_node *head)
-
{
- /*
- 快指针步进长度,之前我认为可以为其它值,但是从Bean_lee的回复中知道,不能为超过循环节点个数的值。
- 当超过循环节点个数时,而慢结点还未步入这个循环时,快节点会一直在循环中步进直至慢节点也步入这个循环。
- */
-
#define FAST_POINT_STEP 2
-
-
if (!head) return FALSE;
-
-
struct list_node *fast, *slow;
-
unsigned int i;
/* 快慢指针都处于同一起跑线,即头指针位置 */
-
fast = slow = head;
-
-
while (fast) {
/* 快指针步进 */
-
for (i = 0; i < FAST_POINT_STEP; ++i) {
-
fast = fast->next;
-
if (fast == slow) {
- /* 又碰到了慢指针,循环存在 */
-
return TRUE;
-
}
-
else if (!fast) {
- /* 快指针跑到头了,循环不存在 */
-
return FALSE;
-
}
-
}
/* 慢指针步进 */
-
slow = slow->next;
-
}
-
-
return FALSE;
-
}