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

posts - 297,  comments - 15,  trackbacks - 0

題目:給你一個單向鏈表的頭指針,可能最后不是NULL終止,而是循環(huán)鏈表。題目問你怎么找出這個鏈表循環(huán)部分的第一個節(jié)點。比如下面的鏈表:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 循環(huán)
當然盡量用少的空間和時間是題目的要求。
(1).判斷指針A和B在環(huán)內(nèi)首次相遇:
有兩個指針A和B,從鏈表的頭節(jié)點出發(fā),A的步長是1,B的步長是2,那么當他們在環(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前進,需要路程b-c+x*b=(x+1)b-c,由1可知,a=kb-c,那么也就是說:指針A要到達環(huán)節(jié)點還需要走的路程kb-c正好等于a。這樣問題就解決了:A從首次相遇的位置步長為1走到環(huán)節(jié)點需要kb-c,那么B只需從頭節(jié)點步長為一走a個節(jié)點,就到達了環(huán)節(jié)點。這時A和B相遇。
大功告成也?。。。。。。。。。?!時間復(fù)雜度O(n),空間復(fù)雜度O(1)!!!?。。。。。。。。。。。。。。。。。。。。?!
posted on 2008-09-14 23:29 chatler 閱讀(1911) 評論(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ù)  更多評論
  
<2025年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>
            最新高清无码专区| 精品51国产黑色丝袜高跟鞋| 最新国产成人在线观看| 噜噜噜在线观看免费视频日韩| 欧美一进一出视频| 久久精选视频| 免费在线国产精品| 欧美高清在线视频观看不卡| 亚洲经典在线看| 一区二区三区四区蜜桃| 亚洲中无吗在线| 久久久久久一区二区三区| 久久久久久综合网天天| 欧美成人一区二区三区| 欧美日韩国产a| 国产欧美日韩一区二区三区| 影音先锋亚洲视频| 香港久久久电影| 麻豆国产精品va在线观看不卡| 久久久精品999| 亚洲国产精品久久久久秋霞不卡| 99爱精品视频| 久久精品一区二区三区不卡| 欧美成人精品一区二区| 国产精品家教| 亚洲国产精品www| 香蕉乱码成人久久天堂爱免费| 久久天天躁夜夜躁狠狠躁2022| 最新亚洲激情| 久久精品论坛| 国产精品乱码妇女bbbb| 91久久久久久久久| 欧美中文字幕| 日韩一级免费观看| 老色鬼久久亚洲一区二区| 国产精品久久中文| 99热精品在线| 欧美成人一区二区在线 | 亚洲福利视频三区| 亚洲天堂视频在线观看| 免费久久99精品国产自| 国产一区二区三区在线观看免费 | 性一交一乱一区二区洋洋av| 亚洲福利一区| 久久午夜av| 国产在线播精品第三| 亚洲在线网站| 亚洲精品一区二区在线| 欧美不卡一区| 亚洲二区视频在线| 久久夜色精品国产亚洲aⅴ| 亚洲性色视频| 国产精品久久久久久久浪潮网站| 亚洲欧洲一区二区在线观看| 裸体歌舞表演一区二区| 久久疯狂做爰流白浆xx| 国产亚洲欧美一级| 久久亚洲免费| 久久久久久黄| 1024成人| 欧美激情一二三区| 免费视频最近日韩| 91久久久在线| 亚洲欧洲另类国产综合| 欧美精品成人一区二区在线观看 | 亚洲国产小视频在线观看| 美女主播视频一区| 狠狠综合久久| 国产精品啊v在线| 亚洲天堂黄色| 亚洲一区二区黄色| 国产欧美日韩一区二区三区| 久久精品天堂| 久久综合久久综合九色| 亚洲激情另类| 亚洲精品一线二线三线无人区| 欧美激情一二三区| 亚洲视频精选在线| 亚洲视频欧洲视频| 国产麻豆视频精品| 媚黑女一区二区| 欧美国产一区在线| 亚洲一区区二区| 欧美一区二区三区在线播放| 韩国三级电影一区二区| 亚洲第一在线视频| 国产精品大全| 理论片一区二区在线| 欧美韩国在线| 欧美一区午夜精品| 欧美成人按摩| 欧美综合77777色婷婷| 美女任你摸久久| 亚洲一区二区在线免费观看| 欧美怡红院视频| 亚洲免费精彩视频| 午夜免费电影一区在线观看| 亚洲人成在线播放| 午夜在线视频观看日韩17c| 亚洲国产精品久久久| 亚洲一区www| 亚洲精品乱码久久久久久按摩观| 一区二区三区四区五区精品| 在线观看日产精品| 亚洲一区二区久久| 日韩视频一区| 久久人人97超碰精品888| 亚洲在线一区| 欧美精品一区在线播放| 久久婷婷综合激情| 国产精品欧美激情| 亚洲激情视频网站| 一区二区三区在线免费播放| 亚洲一级片在线观看| 亚洲最新中文字幕| 久久综合九色综合网站| 久久久天天操| 国产精品视频免费观看| 亚洲精品在线电影| 最近中文字幕日韩精品| 欧美亚洲视频一区二区| 亚洲淫性视频| 欧美日韩国内自拍| 亚洲日本电影在线| 亚洲国内高清视频| 欧美影院一区| 久久精品人人| 国产精品夜夜夜| 亚洲欧美成人一区二区在线电影 | 国产乱人伦精品一区二区| 亚洲永久免费观看| 欧美日韩国产123区| 亚洲国产一区二区精品专区| 亚洲福利视频专区| 久久久久久尹人网香蕉| 久久一区精品| 在线观看一区| 米奇777超碰欧美日韩亚洲| 免费在线看成人av| 亚洲第一精品夜夜躁人人躁| 久久久久看片| 亚洲国产精品一区二区久| 91久久夜色精品国产九色| 欧美风情在线| 亚洲免费观看高清完整版在线观看| 99精品国产在热久久下载| 欧美激情亚洲另类| 亚洲久久一区二区| 亚洲中字在线| 国产农村妇女精品一区二区| 欧美一区二区三区在线观看| 美女视频黄免费的久久| 91久久国产精品91久久性色| 欧美国产日韩一二三区| 一二三区精品福利视频| 亚洲欧美中文日韩v在线观看| 国产精品一二| 久久精品一区四区| 亚洲国产精品专区久久| 亚洲视频在线观看三级| 国产精品亚洲综合天堂夜夜| 久久久水蜜桃av免费网站| 亚洲国产成人一区| 亚洲一区在线看| 国产亚洲精品久久飘花| 另类欧美日韩国产在线| 日韩午夜免费视频| 久久久久久久999| 91久久视频| 国产美女精品| 欧美成人精品影院| 午夜在线成人av| 最新日韩在线| 久久亚洲综合色一区二区三区| 久久久久高清| 影音先锋亚洲一区| 国产精品盗摄一区二区三区| 久久久久久久综合狠狠综合| 99精品欧美一区二区三区| 久久午夜羞羞影院免费观看| 亚洲精品永久免费| 国产精品一区二区你懂得| 久久在线精品| 亚洲欧美日韩成人| 亚洲区一区二区三区| 欧美伊人久久久久久午夜久久久久| 亚洲电影观看| 国产午夜一区二区三区| 欧美日韩亚洲国产精品| 久久人人97超碰精品888| 亚洲欧美国产日韩中文字幕| 91久久夜色精品国产九色| 久久精品成人一区二区三区| 中文在线不卡视频| 91久久精品一区二区三区| 国产综合av| 国产女主播一区二区三区| 国产精品v亚洲精品v日韩精品 | 久久精品国产欧美亚洲人人爽| 国模精品一区二区三区|