0
点赞
收藏
分享

微信扫一扫

Leetcode142.环形链表Ⅱ(快慢指针思想)

乱世小白 2022-01-24 阅读 107

在这里插入图片描述
本题我们仍然用快慢指针思想去解决:
一、首先判断是否为环形链表{
此题我们用快慢指针思想去解决
①首先我们创建两个指针,一个快的(一次走两步),一个慢的(一次走一步)
②如果说我们是个环形链表的话,那么我们两个指针肯定会相遇的,就是指向同一个地址。
③如果快的指针指向了空地址,那么就意味着不是环形链表
}
二、若为环形链表,我们来确定环开始的位置{
①通过第一步我们确定了它为环形链表,
在这里插入图片描述
①这里两个快慢指针第一次相遇后,在结点7的位置,此时将我们的慢指针重新指向头节点2,
②此时我们快慢指针距离环头节点距离相同 都为3
③让我们的快慢指针都走一步,直到相遇,就是我们的环的头节点
④找到后我们对环的头节点位置输出即可
}

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head == NULL) return NULL;
    struct ListNode *p=head,*pr=head->next;
    while(p != pr && pr && pr->next){//pr->next为了判断快指针所指的下一个是否为空,
    //如果不判断,运行可能会报错空指针问题
        p = p->next;
        pr = pr->next->next;
    }
    if(pr==NULL || pr->next == NULL) return NULL;//以上是判断是否为环链表
    p = head->next;		
    pr = head->next->next;
    while(p != pr){//通过快慢指针思想,去让两个指针第一次相遇
        p = p->next;
        pr = pr->next->next;
    }
    p = head;//将慢指针重新指向头节点
    while(p != pr){//当两个指针第二次相遇时,就是我们的环链表的开始位置
        p = p->next;
        pr= pr->next;
    }
    return p;
}
举报

相关推荐

0 条评论