美文网首页
单链表——快速找到未知长度单链表的中间节点

单链表——快速找到未知长度单链表的中间节点

作者: 早起的小孩没饭儿吃 | 来源:发表于2017-02-15 14:44 被阅读99次

    实现方式有二:
    1、常规方法:

    (1)遍历一遍单链表,计算单链表的长度L

    (2)计算中间节点j为L/2,(或者当L为奇数时:(L-1)/2)

    (3)从来开始查找,直到查找到第j个节点

    {
        linklist p;
        int count = 0;
        int midCount = 0;
        int i = 0;
        p = *L;
        if (!p)
        {
            return Error
        }
        while( p->next != NULL)        //遍历链表,得到链表长度
        {
            p = p->next;
            count += 1;
        }
        midCount = int (count/2);    //得到中间结点的个数
        p = *L;
        for( ;i < midCount; i++)
        {
            P = P->next;
        }
        *e = p->data;return *e;      //返回中间节点
    }
    
    

    2、高级方法
    (1)定义两个指针,都从头结点出发,但是一个是快指针,一个是慢指针,快指针一次走两个,慢指针一次走一个当快指针遍历完链表时,慢指针正好走到,链表的中间。

    Status findMidNode(linklist *L,ElemType *e)
    {
        linklist p,q;
        p = *L;
        q = *L;
        if (!p)
        {
            return Error
        }
        while( p->next != NULL)
        {
            if (p->next->next != NULL)
            {
                p = p->next->next;
           q = q->next
    
            }
            else
                {
                    p = p->next;
                }
        }
      *e = q->ata;
        return *e
    }
    

    对比:常规方法时间复杂度O(1.5*n),高级方法时间复杂度O(0.5 * n)。

    相关文章

      网友评论

          本文标题:单链表——快速找到未知长度单链表的中间节点

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