如何判断单链表有环,两种方法,非常简单!

最近在做数据结构的题目,要求判断单链表是否有环(最后一个结点指向其中某个结点)

网上看到的主流方法都是设置快慢指针,这里我提供一个不一样的思路。

1. 从头结点开始遍历,将next指针指向前一个结点,如果单链表没有环,在遍历到最后一个结点的时候会直接指向NULL;如果单链表有环,由于前面一边遍历一点改变next指针指向,他会径直遍历到头结点处。

代码如下

int JudgeCycle(LinkList L) {          
    LNode* p=L->Next, *q,*pre;
    pre = L;
    while (p != L) {
        q = p->Next;
        p->Next = pre;
        pre = p;
        p = q;
        if (p->Next == NULL) return 1;    //无环
    }
    return -1;                     //有环

2.如果想更进一步判断环的入口处在哪,还是要借助快慢指针。参考王道数据结构P59页思路。

LNode* FindLoopStart(LNode* head) {              
    LNode* fast = head, * slow = head;
    while (fast != NULL && fast->Next != NULL) {       //没有环 可以由此退出;有环的话利用下面的break退出
        slow = slow->Next;
        fast = fast->Next->Next;
        if (slow == fast)break;       //相遇
    }
    if (slow == NULL || fast->Next == NULL)
        return NULL;        //没有环,退出
    LNode* p1 = head, * p2 = slow;         //分别指向开始点和相遇点
    while (p1 != p2) {
        p1 = p1->Next;
        p2 = p2->Next;
    }
    return p1;        //返回入口点
}

你可能感兴趣的:(如何判断单链表有环,两种方法,非常简单!)