23.链表中环的入口节点
题目描述
一个链表中包含环,请找出该链表的环的入口结点。
没有环则返回空。
分析
思路和《剑指offer》上的一样。分三个步骤。
第一步,判断链表中是否存在环。
第二步,判断环的大小
第三步,得到环的入口节点
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL) return NULL;
// 判断是否存在环
ListNode* p1 = pHead;
ListNode* p2 = pHead;
p1 = p1->next;
p2 = p2->next;
p2 = p2->next;
bool isLoop = false;
while (p1 != NULL && p2 != NULL) {
if (p1 == p2 && p2 != NULL) {
isLoop = true;
break;
}
p1 = p1->next;
p2 = p2->next;
if (p2 != NULL) {
p2 = p2->next;
}
}
if (!isLoop) return NULL;
// 得到环的大小
int num_node = 1;
p2 = p2->next;
while (p1 != p2) {
num_node++;
p2 = p2->next;
}
// 得到环的入口节点
int idx = 1;
p1 = pHead;
p2 = pHead;
while (idx <= num_node) {
p1 = p1->next;
idx++;
}
while (p1 != p2 && p1 != NULL) {
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};