您的位置:首页 > 编程语言 > C语言/C++

有关单链表带环的问题

2017-03-16 22:46 246 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 单链表