【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针

前端之家收集整理的这篇文章主要介绍了【数据结构】单链表—判断一个链表是否形成了环形结构 — 快慢指针前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

题目:判断一个链表是否形成了环形结构?
思路:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步,如果走的快的指针追上走的慢的指针,那么链表就是环形链表,如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么这个链表就不是环形链表。

代码如下:

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;
};

猜你在找的数据结构相关文章