链表中的入口节点
题目描述
| 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 |
题目分析
| (1)首先判断链表是否有环,我们可以通过两个指针,以不同的速度遍历链表,如果最终两个指针相遇,则证明链表有环,如果遇到空指针,则链表无环。 (2)如果有环,获取环上的节点数n (3)定义两个指针,一个先走n个节点,然后同时往前遍历,直到两个指针相遇,相遇点即为环的入口节点。 |
代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
int iLoopNodes = 0;
if(!IsLoopList(pHead, iLoopNodes))
return NULL;
ListNode*p1, *p2;
p1 = pHead;
p2 = pHead;
for(int i = 0; i <= iLoopNodes; i++)
p2 = p2->next;
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
bool IsLoopList(ListNode* pHead, int &iLoopNodes)
{
iLoopNodes = 0;
ListNode*p1, *p2;
if(pHead == NULL || pHead->next == NULL)
return false;
p1 = pHead;
p2 = pHead->next;
while(p1 != NULL && p2 != NULL)
{
if(p2->next == NULL)
return false;
if(p1 == p2)
{
while(p1->next != p2)
{
iLoopNodes++;
p1 = p1->next;
}
return true;
}
p1 = p1->next;
p2 = p2->next->next;
}
return false;
}
};