3. 链表求环

作者: 编程半岛 | 来源:发表于2018-06-14 17:08 被阅读2次

    已知链表中可能存在环,若有环返回环起始节点,否则返回NULL

    如图:

    方法一:使用set求环起始节点

    1. 遍历链表,将链表中节点对应的指针(地址)插入set中;
    2. 在遍历时插入节点前,需要在set中查找,第一个在set中发现的节点地址即为链表环的起点。
    ListNode* detectCycle(ListNode* head)
    {
        set<ListNode*> node_set;            // 设置查找集合node_set
        while(head)
        {
            if( node_set.find(head) != node_set.end() )     // 如果node_set中已经出现head,则返回head
            {
                return head;
            }
            node_set.insert(head);
            head = head->next;
        }
        return NULL;
    }
    

    方法二:快慢指针思想

    主要思想

    ListNode* detectCycle(ListNode* head)
    {
        ListNode* fast = head;
        ListNode* slow = head;
        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(head && meet)
        {
            if( head == meet )
            {
                return head;
            }
            head = head->next;
            meet = meet->next;
        }
        return NULL;
    }
    

    方法一c++代码
    方法二c++代码

    相关文章

      网友评论

        本文标题:3. 链表求环

        本文链接:https://www.haomeiwen.com/subject/fhwvsftx.html