给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

题目要求:

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

示例:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

 一.判断是否有环

       判断是否有环的方法就是定义两个指针,一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步,如果走到某一位置时,快指针和满指针相同,那么就可以证明有环。

具体如下:

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

 代码如下:

bool hasCycle(struct ListNode *head) {
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

 二.寻找开始入环的第一个节点

建立一个新的指针指向相遇的结点,相遇的结点就是第一次入环的结点的前一个,

整体代码如下:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow,*fast;
    slow=fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            struct ListNode *meet=slow;
            while(meet!=head)
            {
                meet=meet->next;
                head=head->next;
            }
            return meet;
        }
    }
    return NULL;
    
}

上一篇:算法23 leetcode回文链表


下一篇:链表带环问题