• <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>

            牽著老婆滿街逛

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

            找出單向鏈表的倒數第m個元素

            鏈表節點:
            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)
            {
                
            // 第一次遍歷,獲取鏈表的計數
                Node* pCurrent = pHead;
                
            int nCount = 0;
                
            while (pCurrent)
                
            {
                    
            ++nCount;
                    pCurrent 
            = pCurrent->next;
                }


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

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


                    pCurrent 
            = pCurrent->next;
                }


                
            return 0;
            }
            這個算法很低效,要循環列表兩次,從時間上來說,消耗很大.從空間上,需要3個臨時變量,消耗也有點大.


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

                    
            else
                    
            {
                        
            return NULL;
                    }

                }


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


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

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

            評論

            # re: 找出單向鏈表的倒數第m個元素[未登錄] 2010-06-02 18:47 R

            pFind = pFind->next;
            // 間隔m個元素
            pCurrent = pCurrent->next;
            實際上是遍歷兩遍,時間復雜度和最簡單的想法沒有區別  回復  更多評論   

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

            @R
            的確,這塊代碼算起來的確是遍歷了兩遍.
            其實在空間上還可以節省掉一個臨時變量的,那就是pFind,可以利用pHead,不過這樣的話,閱讀起來就會讓人誤解.  回復  更多評論   

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

            以前面試題做到過,當時不會,后來知道這個答案了也驚嘆了一下。
            現在看到樓上們說的,確實是兩遍,跟最笨的方法——找到結尾回頭找——相比,也根本好不到哪里去。。。學習了……  回復  更多評論   

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

            呵呵,我也是做的面試題.
            還是這個算法比較符合我的理想中的美學.  回復  更多評論   

            # re: 找出單向鏈表的倒數第m個元素 2010-06-10 10:35 imok

            這個方法明顯比那種遍歷兩次的方法要高效,而不是根本好不到哪里去  回復  更多評論   

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

            我把兩種算法都放出來了,
            這個一比較就很明白了.
            第一個算法,需要循環鏈表兩次.
            第二個算法,只需要循環鏈表一次就足夠了.

            另外附上遍歷的概念解釋:
            所謂遍歷(Traversal)是指沿著某條搜索路線,依次對樹中每個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴于具體的應用問題。  回復  更多評論   

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

            第二種算法,至少要少訪問鏈表的節點m-1次.
            可以直接去profile獲取直觀的時間損耗.  回復  更多評論   

            久久亚洲AV成人无码电影| 93精91精品国产综合久久香蕉 | 久久久WWW成人| 久久国产美女免费观看精品| 国产精品99久久久久久宅男小说| 97精品依人久久久大香线蕉97| 99精品国产在热久久无毒不卡 | 亚洲欧美国产日韩综合久久| 无码国内精品久久人妻蜜桃| 国产福利电影一区二区三区久久久久成人精品综合 | 国产精品永久久久久久久久久| 久久婷婷人人澡人人爽人人爱| 国产V综合V亚洲欧美久久| 久久久精品久久久久久| 久久久女人与动物群交毛片| 色欲综合久久躁天天躁| 国产精品美女久久久久| 7777精品伊人久久久大香线蕉 | 久久久久AV综合网成人| 久久久91人妻无码精品蜜桃HD| 久久久久免费精品国产 | 久久国产高清字幕中文| 亚洲狠狠婷婷综合久久久久| 四虎影视久久久免费| 国产精品99久久久久久董美香 | 久久久黄片| 亚洲?V乱码久久精品蜜桃| 中文字幕一区二区三区久久网站| 久久天天躁狠狠躁夜夜网站| 97精品伊人久久久大香线蕉| 国内精品久久久久影院老司| 亚洲国产成人久久笫一页| 久久久久亚洲av毛片大 | 欧美牲交A欧牲交aⅴ久久| 久久久久亚洲AV片无码下载蜜桃| 色综合久久中文字幕综合网| 久久中文精品无码中文字幕| 精品久久久久中文字| 久久久WWW成人| 99久久国产亚洲综合精品| 色偷偷88888欧美精品久久久|