题目:判断一个链表是否形成了环形结构?
思路:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,如果走的快的指针追上走的慢的指针,那么链表就是环形链表,如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么这个链表就不是环形链表。
代码如下:
template<class T>
struct ListNode
{
T _value;
ListNode<T>* _next;
ListNode(const T& value)
:_value(value),_next(NULL)
{}
};
template<class T>
class List
{
public:
List()
:_head(NULL)
{}
bool PushBack();
bool IsRing()//判断一个链表是否为环形,快慢指针
{
ListNode<T>* fast = _head;
ListNode<T>* slow = _head;
while(fast != NULL)
{
slow = slow->_next;
fast = fast->_next->_next;
if(slow == fast)
return true;
}
return false;
}
private:
ListNode<T>* _head;
};