计算链表中环的节点数和环的入口节点
利用快慢指针可以解决这个问题(看下面的代码)
//链表的结构类型
struct ListNode {
int m_val;
ListNode* m_pNext;
};
//找到环中任一节点(快慢节点相遇的节点)
ListNode* MettingNode(ListNode* pHead)
{
if (pHead == nullptr)
{
return nullptr;
}
ListNode* pSlow = pHead->m_pNext;
if (pSlow == nullptr)
{
return nullptr;
}
ListNode* pFast=pSlow->m_pNext;
if (pFast == nullptr)
{
return nullptr;
}
while (pFast != nullptr && pSlow != nullptr)
{
if (pFast == pSlow)
{
return pSlow;
}
pSlow = pSlow->m_pNext;
pFast = pFast->m_pNext;
if (pFast != nullptr)
{
pFast = pFast->m_pNext;
}
}
return nullptr;
}
//计算环的节点数,并且找到换的入口
ListNode* EntryNodeLoop(ListNode* pHead)
{
ListNode* mettingnode = MettingNode(pHead);
if (mettingnode == nullptr)
{
return nullptr;
}
//得到环的节点数
int NodeNumber = 0;
ListNode* pNode1 = mettingnode;
while (pNode1 != mettingnode)
{
pNode1 = pNode1->m_pNext;
++NodeNumber;
}
//找环的节点
pNode1 = pHead;
for (int i = 0; i < NodeNumber; ++i)
{
pNode1 = pNode1->m_pNext;
}
ListNode* pNode2 = pHead;
while (pNode2 != pNode1)
{
pNode1 = pNode1->m_pNext;
pNode2 = pNode2->m_pNext;
}
return pNode1;
}