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

posts - 297,  comments - 15,  trackbacks - 0

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

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

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



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

空間復(fù)雜度 O(1).

有向圖采用鄰接表實現(xiàn)。


/* 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;

}
  回復(fù)  更多評論
  
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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>
            亚洲午夜影视影院在线观看| 亚洲精品一线二线三线无人区| 欧美日本国产在线| 久久久久久午夜| 国产精品萝li| 夜夜嗨一区二区| 日韩视频在线一区二区三区| 久久国产加勒比精品无码| 午夜精品国产更新| 欧美午夜剧场| 99热在这里有精品免费| 亚洲日本电影| 免费精品视频| 亚洲成色最大综合在线| 国内精品免费午夜毛片| 亚洲欧美国产毛片在线| 亚洲免费在线视频| 欧美午夜精品久久久久久久 | 亚洲欧美日韩天堂| 亚洲午夜一区二区| 欧美日韩国产成人| 亚洲美女视频在线观看| 99精品欧美一区二区三区综合在线| 美女尤物久久精品| 欧美刺激性大交免费视频| 伊人久久大香线| 久久综合久久久| 欧美黑人在线播放| 亚洲精品中文字幕有码专区| 欧美韩日亚洲| 亚洲乱码国产乱码精品精天堂| 一本综合精品| 国产精品久久7| 亚洲综合成人婷婷小说| 久久九九国产| 亚洲国产精品久久久久秋霞蜜臀| 久久综合九色综合久99| 亚洲国产美女| 亚洲校园激情| 国产在线一区二区三区四区| 久久久久久久久岛国免费| 欧美成人免费小视频| 日韩视频免费大全中文字幕| 欧美三区不卡| 欧美在线亚洲综合一区| 欧美激情网站在线观看| 亚洲午夜视频在线观看| 国产日产欧产精品推荐色| 久久香蕉国产线看观看网| 亚洲国产精品女人久久久| 亚洲一区中文字幕在线观看| 国产日韩一区二区| 蜜臀av在线播放一区二区三区| 亚洲精品国产精品乱码不99按摩| 亚洲一区二区三区四区五区午夜| 国产午夜精品福利| 欧美xx69| 亚洲欧美国产高清| 亚洲高清免费| 久久动漫亚洲| 99re成人精品视频| 国产亚洲一区二区在线观看 | 亚洲天堂av在线免费| 国产欧美一区二区精品仙草咪| 久久综合婷婷| 亚洲中无吗在线| 亚洲国产日韩欧美在线图片| 羞羞视频在线观看欧美| 亚洲精品国精品久久99热一| 国产精品一区二区欧美| 欧美国产精品| 久久成人在线| 正在播放欧美一区| 亚洲激情视频在线观看| 久久精品亚洲一区二区| 一本色道久久88综合日韩精品| 国内精品久久久久影院薰衣草| 欧美午夜a级限制福利片| 久久亚洲精品欧美| 午夜欧美大片免费观看| 一区二区三区欧美视频| 亚洲国产日韩欧美在线图片| 久久色中文字幕| 亚洲欧美国产三级| 一本色道久久综合亚洲精品高清| 在线观看日韩www视频免费| 国产伦精品一区二区三区高清版| 欧美日韩aaaaa| 欧美肥婆bbw| 久久亚洲综合色| 久久久国产精品亚洲一区 | 小黄鸭视频精品导航| 亚洲乱码国产乱码精品精天堂 | 亚洲一区二区欧美| 日韩亚洲欧美成人一区| 最新精品在线| 亚洲高清不卡一区| 在线播放亚洲| 伊人狠狠色丁香综合尤物| 国产日韩欧美在线看| 国产精品手机在线| 国产精品理论片| 国产精品视频一二| 国产乱码精品一区二区三| 国产精品爱啪在线线免费观看| 欧美久久婷婷综合色| 欧美久久久久| 国产精品扒开腿爽爽爽视频| 欧美日韩一区自拍| 国产精品高潮呻吟视频| 国产精品美女久久福利网站| 国产精品一区二区久久国产| 国产精品综合| 国产专区一区| 亚洲国产精品传媒在线观看| 亚洲激情在线| 亚洲毛片在线观看| 亚洲校园激情| 欧美一区免费视频| 久久躁狠狠躁夜夜爽| 欧美韩国日本一区| 亚洲精品自在在线观看| 亚洲先锋成人| 久久精品视频免费| 欧美成人四级电影| 欧美调教vk| 国产一区在线观看视频| 18成人免费观看视频| 亚洲六月丁香色婷婷综合久久| 亚洲一区二区动漫| 久久久久久穴| 亚洲国产精品一区制服丝袜| 99ri日韩精品视频| 午夜久久美女| 欧美高清你懂得| 国产精品乱码久久久久久| 精品福利电影| 99精品欧美| 久久精品一本久久99精品| 亚洲丶国产丶欧美一区二区三区| 日韩视频在线观看一区二区| 性欧美xxxx大乳国产app| 蜜臀久久99精品久久久画质超高清| 欧美日在线观看| 一区免费视频| 亚洲女人小视频在线观看| 久久综合五月| 亚洲特黄一级片| 老司机免费视频一区二区| 国产精品www色诱视频| 亚洲国产经典视频| 午夜日韩在线| 亚洲精品日产精品乱码不卡| 欧美一级黄色录像| 欧美性开放视频| 亚洲欧洲日本国产| 久久精品系列| 宅男精品导航| 欧美精品三级日韩久久| 狠狠爱综合网| 亚洲欧美日韩中文视频| 91久久精品美女高潮| 欧美一区二区三区免费视| 欧美三级视频在线播放| 亚洲激情一区二区三区| 久久久成人网| 亚洲综合色视频| 欧美日韩精品一区二区天天拍小说 | 国产精品有限公司| 99热在线精品观看| 欧美成在线视频| 久久九九电影| 国产亚洲一区在线| 午夜精品视频在线| 99热这里只有成人精品国产| 欧美jjzz| 亚洲欧洲一区二区在线播放| 久久久久五月天| 欧美一级片久久久久久久| 国产精品视频999| 亚洲综合社区| 亚洲一区二区三区视频| 国产精品二区三区四区| 一区二区三区视频观看| 最近中文字幕mv在线一区二区三区四区| 久久久久久九九九九| 国产自产在线视频一区| 久久久www成人免费毛片麻豆| 亚洲欧美日韩一区| 国产视频一区欧美| 欧美诱惑福利视频| 午夜精品一区二区三区在线视| 国产精品美女黄网| 久久gogo国模啪啪人体图| 性欧美1819sex性高清| 国产亚洲欧洲997久久综合| 久久久99国产精品免费| 久久福利视频导航| 亚洲电影免费| 亚洲精品一区二区网址|