C++试题(8)

本文提供了两种有效的算法来判断链表中是否存在环。通过使用两个指针进行追踪的方法,可以在有限的时间内确定链表是否为循环链表。此外,还介绍了另一种通过遍历节点并比较的方式来进行环检测。

编程题目:

Q1.怎么判断链表中是否有环?(该链表不一定是循环单链表或双链表。)

答:设置2个指针追逐

解法1:

bool CircleInList(Link* pHead)
{
if(pHead == NULL || pHead->next == NULL)//无节点或只有一个节点并且无自环
{
return (false);
}
if(pHead->next == pHead)//自环
{
return (true);
}
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead->next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if(pTemp == pTemp1)
{
return (true);
}
return (false);
}

解法2:

bool CircleInList(Link* pHead)
{
    if(pHead == NULL)return false;
    Link *pTemp;
    Link *pTemp2 ;
    int i,j;
    for(i=0,pTemp = pHead;pTemp;i++, pTemp=pTemp->next)
    {
        for(j=0,pTemp2 = pHead;j<i;j++,pTemp2 = pTemp2 ->next)
        {
            if(pTemp2 == pTemp)return true;
        }
    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值