您的位置:首页 > 其它

【剑指**】23.链表中环的入口节点

2018-02-26 15:14 225 查看

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: