加载中...

单链表判断有没有环

关键点:此处用快慢指针实现,如果链表无环,则最后一个节点的next必然为NULL,如果链表有环,则任何一个节点的next都不为NULL。

解决方案:用快慢指针,pre指针在next不为NULL时每次移动两个节点位置,即 pre=pre->next->next,behind指针每次移动一个节点位置,即 behind=behind->next。当两个指针移动速度不一样时,在有环的情况下,必然会有相等的时候。而在无环的时候,就是 pre 或 pre->next 为NULL的时候。

点击查看代码

#include <iostream>
using namespace std;

//博客园有时候不常看消息,有相关代码疑问的可以联系我,请注明来意,wx:A470216705

struct Node {
    Node* next;
    //int value;
};

bool has_ring(Node* head)
{
    Node* pre = head;
    Node* behind = head;
    while (true)
    {
        if (pre->next != NULL)
            pre = pre->next->next;
        else
            return false;
        behind = behind->next;

        if (pre == NULL)
            return false;

        if (pre == behind)
            return true;
    }
    return false;
}

int main()
{
    Node* head = new Node;
    head->next = NULL;

    Node* p1 = new  Node;
    head->next = p1;
    Node* p2 = new  Node;
    p1->next = p2;
    p2->next = NULL;

    if (has_ring(head)) {
        cout <<"有环"<<endl;
    }
    else
    {
        cout << "无环" << endl;
    }

    p2->next = head;
    if (has_ring(head)) {
        cout << "有环" << endl;
    }
    else
    {
        cout << "无环" << endl;
    }
   

    return 0;
}


posted @ 2022-05-08 23:33  微微微  阅读(23)  评论(0编辑  收藏  举报