#include<iostream>
#include"ListNode.h"
class Solution2{
public:
ListNode* findCycle(ListNode* list){
ListNode* fast = list;
ListNode* slow = list;
ListNode* meet = NULL;
//查找到快慢指针相遇位置并记录
while(fast){
fast = fast->next;
slow = slow->next;
if(!fast){
return NULL;
}
fast = fast->next;
if(fast == slow){
meet = fast;
break;
}
}
//判断相遇位置在末尾
if(meet == NULL){
return NULL;
}
//一个指针从头节点开始,一个指针从相遇节点开始遍历,
//直到相遇,就是环开始的位置
while(meet && list){
if(list == meet){
//返回相遇位置
return list;
}
list = list->next;
meet = meet->next;
}
return NULL;
}
};
int main()
{
ListNode a(8);
ListNode b(1);
ListNode c(2);
ListNode d(3);
ListNode e(4);
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&c;
std::cout<<"the List has been generated!"<<std::endl;
ListNode* p = &a;
Solution2 solution;
ListNode* result =solution.findCycle(p);
std::cout<<"result: "<<result->val<<std::endl;
return 0;
}
单链表求环的起始位置(快慢指针)
最新推荐文章于 2021-04-13 17:36:57 发布