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

posts - 297,  comments - 15,  trackbacks - 0

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

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

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



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

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

有向圖采用鄰接表實(shí)現(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ù)  更多評(píng)論
  
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区成人| 麻豆成人在线观看| 国内自拍亚洲| 激情六月婷婷综合| 亚洲第一黄色| 一区二区高清| 午夜亚洲影视| 久久久久成人精品| 久久人人97超碰人人澡爱香蕉| 开心色5月久久精品| 亚洲国产成人不卡| 日韩亚洲视频| 欧美在线观看视频在线 | 麻豆成人av| 亚洲国产专区校园欧美| 亚洲图片在区色| 久久精品国产亚洲精品| 麻豆成人在线播放| 欧美日韩在线播放一区| 国产日韩欧美不卡在线| 亚洲欧洲精品一区二区精品久久久| 日韩亚洲欧美精品| 久久久久9999亚洲精品| 亚洲一区二区精品在线观看| 蜜臀av国产精品久久久久| 美女精品自拍一二三四| 亚洲第一主播视频| 亚洲直播在线一区| 欧美成人免费播放| 国产在线视频欧美| 99国产精品| 老巨人导航500精品| av成人国产| 麻豆9191精品国产| 国产日韩欧美不卡| 亚洲欧美日本日韩| 亚洲电影免费观看高清完整版| 一区二区三区视频在线 | 亚洲第一黄色网| 亚洲伊人观看| 欧美日韩一区二| 亚洲精品资源| 欧美成人午夜激情视频| 欧美一区二区三区另类| 国产精品盗摄一区二区三区| 亚洲精品久久久久久久久久久久久| 欧美一区二区三区免费观看视频 | 久久精品日韩| 国产日韩欧美在线播放不卡| 亚洲美女尤物影院| 女仆av观看一区| 久久久精品国产一区二区三区 | 亚洲欧洲在线一区| 美女日韩欧美| 久久手机精品视频| 影音先锋久久精品| 免费的成人av| 美女图片一区二区| 亚洲国产成人一区| 欧美激情1区2区3区| 欧美成人高清| 99riav1国产精品视频| 亚洲国产精品久久| 欧美精品亚洲一区二区在线播放| 亚洲国产精品久久久久婷婷老年| 欧美第一黄色网| 欧美二区在线播放| 亚洲午夜精品久久久久久浪潮| av不卡在线看| 国产日产欧美一区| 欧美sm重口味系列视频在线观看| 麻豆freexxxx性91精品| 亚洲人成在线观看网站高清| 亚洲欧洲日产国码二区| 欧美无乱码久久久免费午夜一区 | 国产日韩在线一区| 国产欧美在线观看一区| 一区二区三区日韩精品视频| 欧美国产精品| 久久亚洲高清| 极品少妇一区二区三区精品视频| 久久不射网站| 欧美一区二区高清在线观看| 国产欧美一区二区精品婷婷 | 久久久久国产精品人| 国产欧美精品久久| 久久高清国产| 久久精品国产清高在天天线| 国语自产精品视频在线看一大j8| 久久国产精品久久精品国产| 亚洲影视在线播放| 国产一区二区三区在线观看免费视频 | 亚洲在线成人| 国产精品女人久久久久久| 亚洲自拍偷拍一区| 亚洲香蕉在线观看| 在线播放精品| 99国产精品久久久久老师| 国产一区二区中文| 日韩亚洲欧美成人| 亚洲国产一区二区三区在线播| 亚洲图片欧美一区| 亚洲美女啪啪| 久久国产精品黑丝| 久久成人综合网| 99re6这里只有精品| 久久精品99国产精品酒店日本| 亚洲精品综合久久中文字幕| 久久国产精品高清| 亚洲免费视频中文字幕| 欧美~级网站不卡| 久久久噜噜噜久久中文字免| 欧美日韩亚洲一区二区三区在线观看 | 精品999久久久| 国产精品99久久久久久久久久久久| 伊人久久久大香线蕉综合直播| 一卡二卡3卡四卡高清精品视频| 在线看成人片| 久久精品1区| 久久精品欧美日韩| 国产精品久久久久av| 亚洲欧洲三级电影| 亚洲精品国久久99热| 美女任你摸久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产日韩欧美在线播放| 亚洲一二三级电影| 亚洲欧美国产不卡| 一区二区三区自拍| 欧美激情bt| 亚洲欧洲日韩女同| 亚洲六月丁香色婷婷综合久久| 久热综合在线亚洲精品| 美女在线一区二区| 激情伊人五月天久久综合| 性色一区二区三区| 久久久xxx| 影视先锋久久| 欧美成人免费大片| 亚洲日韩成人| 亚洲一二三区在线| 国产精品视频99| 午夜老司机精品| 美女国产一区| 亚洲精品小视频| 欧美视频国产精品| 亚洲欧美在线一区二区| 久久久久久久久久久久久女国产乱| 国产在线精品自拍| 麻豆精品传媒视频| 99精品国产高清一区二区| 小辣椒精品导航| 怡红院精品视频在线观看极品| 美国十次了思思久久精品导航| 亚洲大片免费看| 亚洲午夜激情| 激情综合电影网| 欧美日韩国产综合新一区| 亚洲在线观看| 亚洲高清资源综合久久精品| 亚洲午夜一级| 国内伊人久久久久久网站视频| 欧美69wwwcom| 亚洲新中文字幕| 欧美福利电影网| 亚洲欧美日韩中文播放| 在线成人免费视频| 国产精品xnxxcom| 麻豆精品国产91久久久久久| 夜夜爽www精品| 欧美gay视频| 亚洲欧美韩国| 亚洲国内精品| 国产欧美日韩三级| 欧美精品在线一区| 欧美在线黄色| 一区二区三区国产在线观看| 另类综合日韩欧美亚洲| 一本在线高清不卡dvd| 国产亚洲一区在线| 欧美日韩中文精品| 久久久亚洲午夜电影| 99精品免费视频| 欧美高清视频在线| 久久精品中文| 亚洲欧美999| 一本久道久久综合狠狠爱| 狠狠色丁香久久综合频道| 欧美日韩免费一区| 猛男gaygay欧美视频| 欧美一区二区三区视频| 一区二区三区欧美视频| 亚洲欧洲日产国产网站| 美腿丝袜亚洲色图| 久久国产福利| 欧美亚洲三级| 香蕉久久国产| 午夜精品久久久久久久蜜桃app| 日韩网站在线观看| 亚洲三级影片|