zoukankan      html  css  js  c++  java
  • 单链表反向查找

      题目:已知一个带有附加头节点的单链表,节点结构为(data,link)。假设该链表只给出了头指针first。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第i个位置上的节点,若查找成功,算法返回该节点的地址;否则返回NULL。

      分析:用一个指针p指向链表的首节点,另一个指针q找到链表正数第i个节点,然后平移指针p和指针q,当指针q指向链表最后一个节点时,指针p恰好指向链表倒数第i个节点。算法思路如下图(查找倒数第二个节点)

          

      源码

    template<class T>
    LinkNode<T>* List<T>::oppoLocate(int i)//返回表中倒数第i个元素的地址
    {
        if(i<0)    return NULL;            //i不合理
        LinkNode<T>* p = first->link;     //p指向首节点
        LinkNode<T>* q = Locate(i);       //q指向正数第i个节点
        while(q->link!=NULL)              //偱链至q指向最后一个节点
        {
            p = p->link;
            q = q->link;
        }
        return p;                        //返回p所指向的倒数第i个结点地址
    };
    
    template<class T>
    LinkNode<T>* List<T>::Locate(int i)    //返回链表中正数第i个元素的地址
    {
        if(i<0)    return NULL;            //i不合理
        LinkNode<T>* current = first;
        int k = 0;
        while(current!=NULL && k<i)        //偱链找第i个结点
        {
            current=current->link;
            k++;
        }
        return current;                    //返回第i个结点地址,若返回NULL,表示i值太大
    };

      上述算法的时间复杂度为O(n),且只需遍历链表一次

  • 相关阅读:
    国外大学公开课
    普瑞马法则
    在一个整数区间里产生一组不重复的随机数
    arm架构下树莓派 运行javafx流程
    Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
    我来了!
    IIS替代方案:Visual Studio自带的WebServer
    网络收藏夹DEMO
    Web收藏夹
    LazyGuy的BLOG搬迁至CNBLOGS
  • 原文地址:https://www.cnblogs.com/eniac12/p/4864900.html
Copyright © 2011-2022 走看看