ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Åжϵ¥Á´±íÊÇ·ñÓл·£¿ÈçºÎÕÒµ½»·µÄ¡°Æðʼ¡±µã£¿ÈçºÎÖªµÀ»·µÄ³¤¶È£¿
2014-11-24 02:23:10 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1302´Î
Tags£ºÅÐ¶Ï µ¥Á´±í ÊÇ·ñ ÈçºÎ ÕÒµ½ Æðʼ ¡±µã ÖªµÀ ³¤¶È

Ë㷨˼Ï룺
ÏÈ·ÖÎöÊÇ·ñÓл·¡£Îª´ËÎÒÃǽ¨Á¢Á½¸öÖ¸Õ룬´ÓheaderÒ»ÆðÏòÇ°ÅÜ£¬Ò»¸ö²½³¤Îª1£¬Ò»¸ö²½³¤Îª2£¬ÓÃwhile£¨Ö±µ½²½³¤2µÄÅܵ½½á⣩¼ì²éÁ½¸öÖ¸ÕëÊÇ·ñÏàµÈ£¬Ö±µ½ÕÒµ½ÎªÖ¹¡£
static bool JudgeCircleExists(Link head)
{
Link first = head; //1 step each time
Link second = head; //2 steps each time
while (second.Next != null && second.Next.Next != null)
{
second = second.Next.Next;
first = first.Next;
if (second == first)
return true;
}
return false;
}


ÄÇÓÖÈçºÎÖªµÀ»·µÄ³¤¶ÈÄØ£¿
¸ù¾ÝÉÏÃæµÄËã·¨£¬ÔÚ·µ»ØtrueµÄµØ·½£¬Ò²¾ÍÊÇ2¸öÖ¸ÕëÏàÓö´¦£¬Õâ¸öλÖõĽڵãP¿Ï¶¨Î»ÓÚ»·ÉÏ¡£ÎÒÃÇ´ÓÕâ¸ö½Úµã¿ªÊ¼ÏÈÇ°×ߣ¬×ªÁËһȦ¿Ï¶¨ÄÜ»ØÀ´£º
static int GetCircleLength(Link point)
{
int length = 1;
Link curr = point;
while (curr.Next != point)
{
length++;
curr = curr.Next;
}
return length;
}


¼ÌÐøÎÒÃǵÄÌÖÂÛ£¬ÈçºÎÕÒµ½»·µÄ¡°Æðʼ¡±µãÄØ£¿
ÑÓÐøÉÏÃæµÄ˼·£¬ÎÒÃÇÈÔÈ»ÔÚ·µ»ØtrueµÄµØ·½P£¬¼ÆËãһϴÓÓл·µ¥Á´±íµÄ±íÍ·headµ½PµãµÄ¾àÀë
static int GetLengthFromHeadToPoint(Link head, Link point)
{
int length = 1;
Link curr = head;
while (curr != point)
{
length++;
curr = curr.Next;
}
return length;
}


Èç¹ûÎÒÃÇ°Ñ»·´ÓPµã¡°Çпª¡±£¨µ±È»²¢²»ÊÇÕæµÄÇУ¬ÄǾÍÆÆ»µÔ­À´µÄÊý¾Ý½á¹¹ÁË£©£¬ÄÇôÎÊÌâ¾Íת»¯Îª¼ÆËãÁ½¸öÏཻ¡°µ¥Á´±í¡±µÄ½»µã£¨µÚ10Ì⣩£º
Ò»¸öµ¥Á´±íÊÇ´ÓPµã³ö·¢£¬µ½´ïP£¨Ò»¸ö»ØȦ£©£¬¾àÀëM£»ÁíÒ»¸öµ¥Á´±í´ÓÓл·µ¥Á´±íµÄ±íÍ·head³ö·¢£¬µ½´ïP£¬¾àÀëN¡£
ÎÒÃÇ¿ÉÒԲο¼µÚ10ÌâµÄGetIntersect·½·¨²¢ÉÔ×÷Ð޸ġ£
private static Link FindIntersect(Link head)
{
Link p = null;
//get the point in the circle
bool result = JudgeCircleExists(head, ref p);
if (!result) return null;
Link curr1 = head.Next;
Link curr2 = p.Next;
//length from head to p
int M = 1;
while (curr1 != p)
{
M++;
curr1 = curr1.Next;
}
//circle length
int N = 1;
while (curr2 != p)
{
N++;
curr2 = curr2.Next;
}
//recover curr1 & curr2
curr1 = head.Next;
curr2 = p.Next;
//make 2 links have the same distance to the intersect
if (M > N)
{
for (int i = 0; i < M ¨C N; i++)
curr1 = curr1.Next;
}
else if (M < N)
{
for (int i = 0; i < N ¨C M; i++)
curr2 = curr2.Next;
}
//goto the intersect
while (curr1 != p)
{
if (curr1 == curr2)
{
return curr1;
}
curr1 = curr1.Next;
curr2 = curr2.Next;
}
return null;
}


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºOracle DBA±ÊÊÔÌâ ÏÂһƪ£ºatexitº¯Êý×öʲôµÄ

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿