美文网首页算法
链表有环问题

链表有环问题

作者: Sivin | 来源:发表于2018-04-25 21:56 被阅读5次

问题1: 给定一个链表,判断这个链表是否有环

原理:使用快慢指针法,如果链表有环,则必定存在两个指针相等.

typedef int ElementType;
struct Node{
    ElementType data;
    struct Node* next;
};
typedef struct Node* PNode;
typedef PNode List;

/**
 * 判断一个链表是否有环
 * @param list
 * @return 0 :无, 1:有
 */
int existLoop(List list){
    if(list == NULL) return 0;
    PNode fast , slow;
    slow = fast = list;
    while (fast->next != NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
            return 1;
        }
    }
    return 0;
}

问题2: 如果链表有环,找出环的入口节点

对于有环的链表,使用快慢指针法(快指针的速度=2 倍慢指针的速度),当第一次相遇的节点一定在环上,相遇的结点到环的入口距离与链表入口点到环入口结点距离相等

PNode getEntreLoop(List list){
    if(list == NULL) return 0;
    PNode fast , slow;
    slow = fast = list;
    while (fast->next != NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
            //快慢指针第一次相遇的节点
            break;
        }
    }
    
    PNode ptr01 = slow , ptr02 = list;
    while (fast->next != NULL){
        ptr01 = ptr01->next;
        ptr02 = ptr02->next;
        if(ptr01 == ptr02){
            printf("\n找到环的入口点:%d\n",ptr02->data);
            return ptr02;
        }
    }
    return NULL;
}

问题3: 环有多长

原理:快慢指针第一遍相遇后,然后在进行第二遍循,当快慢指针再一次相遇时,记录慢指针走的步数就是,环的长度.

int getLoopLen(List list){
    if(list == NULL) return 0;
    PNode fast , slow;
    slow = fast = list;
    while (fast->next != NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
            //快慢指针第一次相遇的节点
            break;
        }
    }
 
     int len = 0;   
 
    while (fast->next != NULL){
        len++;
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
         //快慢指针第二次相遇的节点
         return len;
        }
    }
    return 0;
}

相关文章

  • 链表-链表有环问题

    1. 判断一个单向链表是否有环 有环的链链表大概张这样 有环的链表和普通的链表的区别就是尾指针指向了链表中的某一个...

  • 链表算法面试?看我就够了!——链表中存在环问题

    链表中存在环问题 3.1 判断链表是否有环 单链表中的环是指链表末尾的节点的 next 指针不为 NULL ,而是...

  • 链表有环问题

    问题1: 给定一个链表,判断这个链表是否有环 原理:使用快慢指针法,如果链表有环,则必定存在两个指针相等. 问题2...

  • 1.数据结构-链表问题

    链表相关问题 删除节点 链表去重 有环链表 反转链表 链表排序 链表相交 其他问题 面试题 02.03. 删除中间...

  • 有环单链表的相关问题

    问题:判断单链表是否有环;若有环,找出环的入口节点;若有环,求出环上节点的个数;若有环,求出整个链表的节点的个数;...

  • c语言判断链表是否有环

    1.问题描述 判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 ,链表中...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • 判断单链表是否有环、求环长和环入口最优算法

    判断单链表是否有环、求环长和环入口最优算法 判断单链表是否有环是一个十分经典的算法问题,许多考试或者面试都有很大的...

  • leetcode解题思想--141. 环形链表(Linked L

    问题描述 给定一个链表,判断链表中是否有环。 leetcode原题链接 问题分析 朴素思维:从头遍历链表,每遍历到...

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

网友评论

    本文标题:链表有环问题

    本文链接:https://www.haomeiwen.com/subject/mcrulftx.html