题目:判断一个单向链表是否形成了环形结构。
思路:定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向NULL)都没有追上第一个指针,那么链表就不是环形链表。
代码:
# include<iostream>
using namespace std;
struct ListNode
{
int key;
ListNode *next;
ListNode():next(NULL),key(0){}
};
bool FindMiddleNode(ListNode *head)
{
if(head == NULL )
{
return false;
}
ListNode *fast=head;
ListNode *slow=head;
while(fast->next != NULL)
{
if(fast->next->next != NULL)
{
fast=fast->next->next;
}
else
{
return false;
}
if(fast == slow)
{
return true;
}
slow=slow->next;
}
return false;
}
int main()
{
ListNode *l1=new ListNode();
ListNode *l2=new ListNode();
ListNode *l3=new ListNode();
ListNode *l4=new ListNode();
ListNode *l5=new ListNode();
ListNode *l6=new ListNode();
ListNode *l7=new ListNode();
l1->next=l2;
l2->next=l3;
l3->next=l4;
l4->next=l5;
l5->next=l6;
l6->next=l7;
l7->next=l1;
l1->key=1;
l2->key=5;
l3->key=86;
l4->key=16;
l5->key=34;
l6->key=94;
l7->key=100;
cout<<FindMiddleNode(l1)<<endl;
return 0;
}