• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            找出單向鏈表的倒數(shù)第m個(gè)元素

            鏈表節(jié)點(diǎn):
            class Node
            {
            public:
                
            int        data;
                Node
            *    next;

            public:
                Node(
            int n) : data(n), next(0)
                
            {
                }


                Node() : data(
            0), next(0)
                
            {
                }


                Node
            * InsertAfter( int _data )
                
            {
                    Node
            * newnode = new Node(_data);

                    newnode
            ->next = next;
                    next 
            = newnode;

                    
            return newnode;
                }

            }
            ;


            低效的查找算法:
            Node* FindMToLastNode(Node* pHead, int m)
            {
                
            // 第一次遍歷,獲取鏈表的計(jì)數(shù)
                Node* pCurrent = pHead;
                
            int nCount = 0;
                
            while (pCurrent)
                
            {
                    
            ++nCount;
                    pCurrent 
            = pCurrent->next;
                }


                
            // 防止越界
                if (m > nCount) return 0;

                
            // 第二遍遍歷,獲取倒數(shù)第m個(gè)節(jié)點(diǎn),也就是順數(shù)滴n個(gè)節(jié)點(diǎn)
                int n = nCount - m + 1;
                nCount 
            = 0;
                pCurrent 
            = pHead;
                
            while (pCurrent)
                
            {
                    
            ++nCount;
                    
            if (nCount == n)
                    
            {
                        
            return pCurrent;
                    }


                    pCurrent 
            = pCurrent->next;
                }


                
            return 0;
            }
            這個(gè)算法很低效,要循環(huán)列表兩次,從時(shí)間上來(lái)說(shuō),消耗很大.從空間上,需要3個(gè)臨時(shí)變量,消耗也有點(diǎn)大.


            高效的查找算法:
            Node* FindMToLastNode(Node* pHead, int m)
            {
                
            // 查找到第m個(gè)元素
                Node* pCurrent = pHead;
                
            for (int i = 0; i < m; ++i)
                
            {
                    
            if (pCurrent)
                    
            {
                        pCurrent 
            = pCurrent->next;
                    }

                    
            else
                    
            {
                        
            return NULL;
                    }

                }


                
            // 一起繼續(xù)遍歷到鏈表尾部,
                
            // 現(xiàn)在pFind和pCurrent之間間隔了m個(gè)元素,
                
            // 所以,當(dāng)pCurrent遍歷到尾部的時(shí)候,
                
            // pFind就到了倒數(shù)第m個(gè)元素的位置上.
                Node* pFind = pHead;
                
            while (pCurrent)
                
            {
                    pFind        
            = pFind->next;
                    
            // 間隔m個(gè)元素
                    pCurrent    = pCurrent->next;
                }


                
            return pFind;
            }
            這個(gè)算法果然精妙!空間上只需要開銷兩個(gè)臨時(shí)變量,時(shí)間上只需要循環(huán)鏈表一遍,也就是O(n)!
            我太笨了,居然沒(méi)有想到如此絕妙的算法.

            posted on 2010-06-02 12:10 楊粼波 閱讀(1212) 評(píng)論(7)  編輯 收藏 引用

            評(píng)論

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素[未登錄](méi) 2010-06-02 18:47 R

            pFind = pFind->next;
            // 間隔m個(gè)元素
            pCurrent = pCurrent->next;
            實(shí)際上是遍歷兩遍,時(shí)間復(fù)雜度和最簡(jiǎn)單的想法沒(méi)有區(qū)別  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-02 19:30 楊粼波

            @R
            的確,這塊代碼算起來(lái)的確是遍歷了兩遍.
            其實(shí)在空間上還可以節(jié)省掉一個(gè)臨時(shí)變量的,那就是pFind,可以利用pHead,不過(guò)這樣的話,閱讀起來(lái)就會(huì)讓人誤解.  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-02 20:30 溪流

            以前面試題做到過(guò),當(dāng)時(shí)不會(huì),后來(lái)知道這個(gè)答案了也驚嘆了一下。
            現(xiàn)在看到樓上們說(shuō)的,確實(shí)是兩遍,跟最笨的方法——找到結(jié)尾回頭找——相比,也根本好不到哪里去。。。學(xué)習(xí)了……  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-02 21:23 楊粼波

            呵呵,我也是做的面試題.
            還是這個(gè)算法比較符合我的理想中的美學(xué).  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-10 10:35 imok

            這個(gè)方法明顯比那種遍歷兩次的方法要高效,而不是根本好不到哪里去  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-10 15:19 楊粼波

            我把兩種算法都放出來(lái)了,
            這個(gè)一比較就很明白了.
            第一個(gè)算法,需要循環(huán)鏈表兩次.
            第二個(gè)算法,只需要循環(huán)鏈表一次就足夠了.

            另外附上遍歷的概念解釋:
            所謂遍歷(Traversal)是指沿著某條搜索路線,依次對(duì)樹中每個(gè)結(jié)點(diǎn)均做一次且僅做一次訪問(wèn)。訪問(wèn)結(jié)點(diǎn)所做的操作依賴于具體的應(yīng)用問(wèn)題。  回復(fù)  更多評(píng)論   

            # re: 找出單向鏈表的倒數(shù)第m個(gè)元素 2010-06-10 15:25 楊粼波

            第二種算法,至少要少訪問(wèn)鏈表的節(jié)點(diǎn)m-1次.
            可以直接去profile獲取直觀的時(shí)間損耗.  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            日日狠狠久久偷偷色综合免费| 成人国内精品久久久久影院VR| 久久久一本精品99久久精品88| 久久久久久久女国产乱让韩| 亚洲AV日韩精品久久久久久| 69国产成人综合久久精品| 国产精品成人99久久久久| 欧美亚洲另类久久综合婷婷| 成人午夜精品无码区久久| 国产99精品久久| 色综合久久天天综线观看| 蜜臀av性久久久久蜜臀aⅴ| 日本精品久久久中文字幕| 色综合久久天天综线观看| 国产精品女同久久久久电影院| 国产精品成人99久久久久| 伊人色综合久久天天人手人婷 | 国产亚洲美女精品久久久2020| 无码国内精品久久人妻| 国产高清美女一级a毛片久久w| 久久久久亚洲AV无码观看| 日韩精品国产自在久久现线拍| 免费精品久久天干天干| 热99re久久国超精品首页| 亚洲精品无码久久久影院相关影片| 99久久精品免费看国产一区二区三区| 久久这里的只有是精品23| 亚洲国产精品久久久久婷婷老年| 婷婷久久五月天| 精品久久综合1区2区3区激情| 亚洲中文久久精品无码| 久久婷婷五月综合97色直播| 国产亚洲综合久久系列| 伊色综合久久之综合久久| 精品乱码久久久久久夜夜嗨| 精品久久久久久成人AV| 欧美国产成人久久精品| 无夜精品久久久久久| 国内精品久久久久久久涩爱| 精品久久久久久国产潘金莲| 97精品伊人久久久大香线蕉|