1.检查链表是否带环,若带求长度,环入口点。
设定两个快慢指针开始时指向起始位置,开始出发,如果这两个指针相交,那么存在环;从交点出发,当再次回到此点便可统计环长度;对与于环入口点,假设快指针每次走两个位置,慢一直走一个,如图所示:
则只需一个从起始点,一个从交点移动,必会相交。
2. 检查两链表否相交(链表不带环)
如果两链表得最后一个位置相等,则相交。
如果带环得话:
以下代码没有实现两个带环的相交
pNode CheckCycle(pList plist) //判断环
{
pNode fast = plist;
pNode slow = plist;
do
{
if (fast->next == NULL && fast == NULL)
return NULL;
fast = fast->next->next;
slow = slow->next;
} while (slow != fast);
return slow;
}
int GetCycleLen(pList plist) //环长度
{
int len = 0;
pNode cur = plist;
do
{
len++;
cur = cur->next;
} while (cur != plist);
return len;
}
pNode GetCycleEntryNode(pList plist, pNode meet) //入口点
{
pNode entry = plist;
while (entry != meet)
{
entry = entry->next;
meet = meet->next;
}
return entry;
}
int CheckCross(pList L1, pList L2) //相交(不带环)
{
pNode prelist1 = L1;
pNode prelist2 = L2;
while (L1)
{
prelist1 = L1;
L1 = L1->next;
}
while (L2)
{
prelist2 = L2;
L2 = L2->next;
}
if (prelist1 == prelist2)
return 1;
else
return 0;
}