青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

題目:給你一個單向鏈表的頭指針,可能最后不是NULL終止,而是循環鏈表。題目問你怎么找出這個鏈表循環部分的第一個節點。比如下面的鏈表:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 循環
當然盡量用少的空間和時間是題目的要求。
(1).判斷指針A和B在環內首次相遇:
有兩個指針A和B,從鏈表的頭節點出發,A的步長是1,B的步長是2,那么當他們在環內相遇時,設a是鏈表頭到環節點的位置,b是環的周長,c是A和B在環上首次相遇時與環節點的距離,m和n分別是第一次相遇時A和B走過的環數,那么:A經歷的路程是a+(m*b+c),B經歷的路程是a+(n*b+c),這時2*A經歷的路程=B經歷的路程,所以得到2*(a+m*b+c)=a+(n*b+c),即a+2mb+c=nb,即
      a+c=(n-2m)b=k*b,k=n-2m -----(1)式.
(2).判斷A和B在環節點相遇:
指針A和B相遇后,如果需要二者相遇在循環鏈表的環節點,則指針A以步長1前進,需要路程b-c+x*b=(x+1)b-c,由1可知,a=kb-c,那么也就是說:指針A要到達環節點還需要走的路程kb-c正好等于a。這樣問題就解決了:A從首次相遇的位置步長為1走到環節點需要kb-c,那么B只需從頭節點步長為一走a個節點,就到達了環節點。這時A和B相遇。
大功告成也!!!!!!!!!!!時間復雜度O(n),空間復雜度O(1)!!!!!!!!!!!!!!!!!!!!!!!!!
posted on 2008-09-14 23:29 chatler 閱讀(1923) 評論(1)  編輯 收藏 引用 所屬分類: Algorithm

FeedBack:
# re: 一個關于單向鏈表的面試題
2008-09-14 23:42 | chatler
還有一種算法,就是用有向圖來實現(具體見下面代碼):
把鏈表看成一個有向圖,深度優先遍歷該有向圖,判斷有無循環出現。

懶得再用中文寫一遍具體算法了,看下面的代碼實現吧,英文注釋解釋的很清楚了。



時間復雜度 O(e), 鏈表邊的總數。

空間復雜度 O(1).

有向圖采用鄰接表實現。


/* file: DFSDetectLoop.cpp */

/*

* Detect if the graph has loop -- For both Undigraph and digraph

* Complexity: O(e); e is the number of arcs in Graph.

*

* BUG Reported:

* 1. Apr-26-07

* Not support Undigraph yet ! Fix me !!!

* - Fixed on Apr-26-08.

*

* Return

* 1 - Loop detected.

* 0 - No loop detected.

* *

* Algrithm:

* 1. Init all the nodes color to WHITE.

* 2. DFS graph

* For each the nodes v in graph, do step (1) and (2).

* (1) If v is WHITE, DFS from node v:

* (a) Mark v as GRAY.

* (b) For every nodes tv adjacent with node v,

* (i) If the current visiting node is gray, then loop detected. exit.

* (ii) Goto Step (1).

* (iii) All the nodes on sub-tree of tv have been visited. Mark node tv as BLACK.

* (2) All the nodes on sub-tree of v have been visited. Mark node v as BLACK.

*

* Function DFSDetectLoop is valid for both Undigraph and digraph.

*

* */

int DFSDetectLoop (ALGraph *graph, int VisitFunc (ALGraph *graph, int v))

{

int v;



for (v = 0; v < graph->vexnum; v++)

{

MarkNodeColor (graph, v, WHITE);

}

for (v = 0; v < graph->vexnum; v++)

{

if (graph->vertices[v].color == WHITE)

{

/* We are good to call DFSDetectLoopSub the first

* time with pv = -1, because no node equals -1.

* */

if (1 == DFSDetectLoopSub (graph, v, -1, VisitFunc))

return 1;

}

MarkNodeColor (graph, v, BLACK);

}

return 1;

}



/*

* Start from node v, DFS graph to detect loop.

* pv is the node that just visited v. pv is used to avoid v to visit pv again.

* pv is introduced to support Undigraph.

*

* NOTE:

* Before calling DFSDetectLoopSub, make sure node v is not visited yet.

* */

int DFSDetectLoopSub (ALGraph *graph, int v, int pv, int VisitFunc (ALGraph *graph, int v))

{

assert (graph->vertices[v].color == WHITE);



MarkNodeColor (graph, v, GRAY);



VisitFunc (graph, v);



ArcNode *arc;

arc = graph->vertices[v].firstarc;

while (arc)

{

int tv = arc->adjvex;



/* For Undigraph, if tv equals pv, this arc should not be count.

* Because we have just visited from pv to v.

* Just go ahead to check next vertex connected with v.

* 1----2, after visit 1, we will visit 2, while visiting 2, 1 will be the 1st node visited.

*

* For digraph, we need to check loop even tv equals pv.

* Because there is case that node v points to u, and u points to v.

* */

if ((graph->kind == AG) && (tv != pv))

{

if ( graph->vertices[tv].color == GRAY )

{

cout << "Gray node visited at node: " << tv + 1 <<endl;

cout << "DFSDetectLoopSub: Loop Detected at from node " << v + 1<<" to "<< tv + 1 <<" !" <<endl;

return 1;

}



if (graph->vertices[tv].color == WHITE)

{

if (1 == DFSDetectLoopSub (graph, tv, v, VisitFunc))

{

return 1;

}

}

/* At this line:

* (1)If tv's color is already BLACK; Go ahead checking next arc;

* (2)If the sub-tree of node tv has all been visited, mark as BLACK and check next arc;

* Backward tv to to v's other adjacent node. So tv should be marked as black.

* */

MarkNodeColor (graph, tv, BLACK);

}



arc = arc->nextarc;

}

return 0;

}
  回復  更多評論
  
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产在线电影| 亚洲午夜女主播在线直播| 久久久91精品国产一区二区三区 | 老司机午夜精品视频在线观看| 国产亚洲欧美日韩一区二区| 久久国产99| 久久久国产亚洲精品| 亚洲第一页自拍| 91久久精品美女| 欧美日韩国产经典色站一区二区三区| 亚洲最新在线| 亚洲欧美国产77777| 国产色综合天天综合网| 久久人人爽国产| 欧美国产精品中文字幕| 亚洲一区二区三区中文字幕在线 | 欧美在线free| 亚洲激情自拍| 9l国产精品久久久久麻豆| 国产一区二区激情| 欧美激情精品久久久久久黑人| 欧美肥婆在线| 久久黄金**| 欧美激情免费观看| 久久国产精品99久久久久久老狼| 老司机精品导航| 亚洲在线中文字幕| 久久久之久亚州精品露出| 亚洲小说欧美另类社区| 久久av二区| 一区二区国产精品| 久久久久久一区二区三区| 亚洲一区二区三区三| 久久男人av资源网站| 午夜国产欧美理论在线播放| 久久―日本道色综合久久| 亚洲永久免费观看| 欧美 日韩 国产 一区| 欧美资源在线| 欧美视频精品在线观看| 免费在线国产精品| 国产精品一区久久久| 亚洲精选在线| 亚洲国产激情| 欧美一区二区三区视频| 亚洲在线观看视频网站| 欧美黄色视屏| 亚洲国产第一页| 在线观看欧美一区| 欧美在线1区| 亚欧成人在线| 国产精品大片免费观看| 91久久久在线| 日韩系列在线| 欧美国产一区二区三区激情无套| 久热精品视频在线观看| 国产日本欧美一区二区| 亚洲小视频在线观看| 亚洲图片欧美日产| 欧美日韩亚洲成人| 亚洲精品资源美女情侣酒店| 日韩视频在线免费观看| 另类激情亚洲| 欧美高清影院| 亚洲精品一区二区三区不| 欧美aⅴ一区二区三区视频| 欧美.www| 最新成人在线| 欧美激情视频给我| 日韩网站在线| 亚洲免费在线看| 国产精品毛片| 午夜久久电影网| 久久九九99| 在线播放日韩| 欧美激情片在线观看| 亚洲精品综合久久中文字幕| 在线一区二区日韩| 国产精品久久久久久久久久三级| 亚洲视频在线观看| 久久精彩免费视频| 在线观看一区| 欧美日本在线| 午夜精品久久久久久久| 免费人成精品欧美精品| 日韩视频免费在线| 国产精品视频xxx| 久久久久国产精品人| 欧美电影免费网站| 亚洲视频播放| 韩国精品久久久999| 欧美成人午夜免费视在线看片| 亚洲精品影视在线观看| 久久九九热免费视频| 亚洲国产精品成人综合色在线婷婷 | 亚洲欧美另类在线| 海角社区69精品视频| 欧美精品福利在线| 午夜宅男欧美| 亚洲精品视频免费| 欧美自拍偷拍午夜视频| 亚洲国产影院| 国产精品一区久久久| 欧美成人一区二区三区| 亚洲欧美成人在线| 亚洲高清精品中出| 欧美一区二区免费观在线| 91久久久亚洲精品| 国产麻豆午夜三级精品| 美女图片一区二区| 亚洲欧美成人在线| 亚洲免费不卡| 牛夜精品久久久久久久99黑人| 亚洲免费视频中文字幕| 亚洲国产欧美不卡在线观看| 国产精品午夜在线观看| 欧美精品在线免费观看| 久久国产精品久久久久久电车 | 久久久久国产免费免费| 日韩亚洲欧美成人| 在线观看欧美一区| 国产日本欧洲亚洲| 欧美体内she精视频在线观看| 老司机免费视频一区二区| 新片速递亚洲合集欧美合集| 亚洲三级观看| 亚洲福利专区| 玖玖玖免费嫩草在线影院一区| 亚洲欧美日韩国产综合| 夜夜爽99久久国产综合精品女不卡| 国内外成人免费激情在线视频网站| 欧美三区视频| 欧美日韩一区视频| 欧美另类视频| 欧美精品啪啪| 欧美日本国产| 欧美精品色网| 欧美日韩久久久久久| 欧美日韩国产在线| 欧美韩日精品| 欧美人交a欧美精品| 欧美激情国产精品| 欧美国内亚洲| 欧美日韩国产综合视频在线观看| 欧美国产一区二区在线观看| 男女精品视频| 欧美二区在线看| 欧美日韩国产首页| 欧美日韩中文字幕在线视频| 欧美日韩国产综合在线| 欧美日韩美女在线观看| 国产精品成人在线| 国产九九视频一区二区三区| 国产欧美日韩一区二区三区在线观看 | 欧美三级电影网| 国产精品久久久久三级| 国产精品视频不卡| 国产自产2019最新不卡| 伊人久久亚洲美女图片| 亚洲国产成人久久综合一区| 91久久综合| 亚洲免费一在线| 久久久久国产一区二区三区四区| 看片网站欧美日韩| 欧美激情在线有限公司| 99精品黄色片免费大全| 亚洲在线播放电影| 久久婷婷一区| 欧美日韩国产高清视频| 国产日产精品一区二区三区四区的观看方式 | 99视频精品全国免费| 亚洲一区二区三区高清不卡| 午夜影院日韩| 欧美成人视屏| 国产精品最新自拍| 亚洲国产婷婷| 亚洲女人天堂av| 欧美高清hd18日本| 国产精品99久久久久久久女警| 欧美主播一区二区三区| 欧美风情在线观看| 国产日韩在线视频| 日韩一区二区福利| 久久精品一区二区三区不卡牛牛| 欧美国产先锋| 午夜精品久久久久久久| 欧美精品久久久久久久久老牛影院| 国产精品日韩一区二区三区| 亚洲国产美女| 久久久不卡网国产精品一区| 亚洲国产一二三| 久久精彩视频| 国产精品午夜av在线| 夜夜精品视频一区二区| 久久综合九色| 性8sex亚洲区入口| 欧美午夜电影在线观看| 亚洲国产精品久久久久秋霞影院| 欧美在线视频免费播放| 亚洲精品在线免费|