C语言实现单链表面试题---进阶

单链表相关的博客:
C语言实现 单向链表
https://blog.csdn.net/qq_37941471/article/details/72961495
C语言实现单链表面试题—基础篇
https://blog.csdn.net/qq_37941471/article/details/78033970

单链表带环问题

  • 解决方法:快慢指针
    1.判断单链表是否带环?若带环,求环的入口点?
    2.判断两个链表是否相交,若相交,求交点。(假设链表不带环)
    3.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】

1.判断单链表是否带环?若带环,求环的入口点?

如何求环的入口点:

这里写图片描述

代码实现:

ListNode* IsCycle(ListNode* plist)//判断链表是否带环?
{
    ListNode* slow = plist;
    ListNode* fast = plist;
    while( fast && fast->next )//如果不带环,快指针先走到尾(终止条件)
    {
        fast = fast->next->next;
        slow = slow->next;
        if( slow == fast )//如果带环,快慢指针一定会相遇
            return slow;
    }
    return NULL;
}

ListNode* GetEnrty(ListNode* plist, ListNode* MeetNode)//若带环,求其入口点。
{
    assert( plist&&MeetNode);
    while( plist != MeetNode )//plist == MeetNode找到入口点
    {
        plist = plist->next ;
        MeetNode = MeetNode->next ;
        if( plist == MeetNode )
            return plist;
    }
    return NULL;
}
void test()
{
    ListNode* list = NULL;
    ListNode* tail;
    ListNode* enrty;//入口点
    ListNode* meet;//相遇点
    PushBack(&list, 1);
    PushBack(&list, 2);
    PushBack(&list, 3);
    PushBack(&list, 4);
    PushBack(&list, 5);
    PushBack(&list, 6);
    PrintList(list);

    tail = Find(list, 6);
    enrty = Find(list, 4);
    tail->next = enrty;//带环

    meet = IsCycle(list);
    printf("入口点:%d\n", GetEnrty(list, meet)->data);
}

猜你喜欢

转载自blog.csdn.net/qq_37941471/article/details/80437143