Check a loop in a list with line…
来源:互联网 发布:数学做题软件 编辑:程序博客网 时间:2024/04/29 22:19
Effectively check a loop in a list with linear cost
=============
1. Analysis
=============
typical case 1:
1->2->3->4->5->6->1 ( loop in header, K = 0, N = 6)
typical case 2:
1->2->3->4->5->6->3 ( loop in node 3, K = 2, N = 4)
Two pointers, one with each step 1, the other with each step2
Suppose step = K + x ( or say cost)
K + x = 2*(K+x) - N
==> x = N - k
=============
2. Algorithm
=============
typedef struct Node Node;
struct Node
{
void* data;
Node* p;
};
boolean check_loop(const Node* p)
{
Node* pTemp = p;
Node* p1 = p?(p->p):NULL;
Node* p2 = (p1)?(p1->p):NULL;
for(;p2;p1 = p1->p,p2 = (pTemp =(p2->p))?(pTemp->p):NULL )
{
if ( p1 == p2)
{
return true;