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

2017-02-15  本文已影响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)。

上一篇下一篇

猜你喜欢

热点阅读