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

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;

}
  回復  更多評論
  
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(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>
            亚洲欧美日韩一区二区三区在线观看 | 在线 亚洲欧美在线综合一区| 男人的天堂亚洲在线| 欧美日韩国产黄| 巨乳诱惑日韩免费av| 国产模特精品视频久久久久| 最新国产成人av网站网址麻豆 | 亚洲片在线观看| 午夜欧美大尺度福利影院在线看| 亚洲美女电影在线| 开元免费观看欧美电视剧网站| 亚洲永久精品大片| 欧美国产综合一区二区| 久久九九国产精品怡红院| 国产精品国产自产拍高清av王其| 91久久精品国产| 亚洲人在线视频| 老司机午夜精品视频| 久久最新视频| 一区二区在线视频| 久久经典综合| 老鸭窝91久久精品色噜噜导演| 国产精品一区二区欧美| 亚洲视频精品在线| 亚洲欧美资源在线| 国产精品美女一区二区| 亚洲婷婷在线| 欧美呦呦网站| 国外成人性视频| 久久午夜电影网| 亚洲国产成人精品女人久久久 | 一区二区成人精品| 欧美日韩精品一区二区三区| 亚洲精品久久久久久久久| 日韩视频永久免费观看| 男人的天堂亚洲在线| 亚洲日本成人女熟在线观看| 一区二区三区视频观看| 国产精品v欧美精品v日韩精品| 亚洲私人影院| 欧美国产视频日韩| 在线观看三级视频欧美| 久久久久久久波多野高潮日日| 浪潮色综合久久天堂| 亚洲精品久久视频| 欧美手机在线| 性欧美videos另类喷潮| 欧美不卡视频一区发布| 99视频一区二区| 国产乱肥老妇国产一区二| 久久精品午夜| 亚洲日本成人在线观看| 欧美在线视频播放| 一区二区在线免费观看| 欧美片在线播放| 亚洲综合日韩| 欧美激情片在线观看| 亚洲欧美日韩国产| 在线观看成人av电影| 欧美日韩在线免费观看| 亚洲宅男天堂在线观看无病毒| 久色成人在线| 在线中文字幕一区| 黄色成人在线观看| 欧美日韩精品免费| 久久av资源网站| 日韩一级精品| 牛夜精品久久久久久久99黑人| 一本久久青青| 亚洲成人在线免费| 国产精品亚洲欧美| 欧美激情1区2区| 欧美一区影院| 99精品欧美一区| 欧美不卡激情三级在线观看| 欧美一区二区三区的| 亚洲人线精品午夜| 国内激情久久| 国产精品久久久久免费a∨大胸| 久久大综合网| 一区二区三区蜜桃网| 欧美成人乱码一区二区三区| 欧美一级欧美一级在线播放| 亚洲欧洲日韩在线| 韩国精品一区二区三区| 欧美高清在线视频| 久久视频在线看| 欧美一区二区三区日韩| 一区二区久久久久| 亚洲人成在线影院| 欧美大片一区二区| 免费成人黄色| 久久久亚洲国产天美传媒修理工 | 亚洲第一在线综合在线| 国产日韩精品视频一区| 国产精品a久久久久| 欧美国产亚洲另类动漫| 久久一区中文字幕| 欧美一区二区三区在线播放| 亚洲一级影院| 亚洲一区二区三区午夜| 在线视频亚洲| 亚洲美女淫视频| 亚洲毛片网站| 亚洲人成在线免费观看| 亚洲激情女人| 亚洲精品久久久久久久久久久久| 欧美成人一二三| 亚洲成色777777在线观看影院| 久久久国产一区二区| 久久av一区二区三区亚洲| 小黄鸭精品aⅴ导航网站入口| 亚洲视频在线免费观看| 日韩午夜免费视频| 亚洲精品自在久久| 亚洲欧洲一区二区在线播放| 亚洲高清在线播放| 亚洲日本理论电影| 亚洲免费精彩视频| 日韩一区二区精品在线观看| 日韩小视频在线观看专区| 中文欧美字幕免费| 午夜精品免费| 久久免费视频在线观看| 欧美mv日韩mv国产网站app| 久久尤物视频| 亚洲激情电影中文字幕| 亚洲日本黄色| 在线午夜精品自拍| 校园激情久久| 欧美福利影院| 国产精品久久久久久久电影 | 欧美精品乱人伦久久久久久| 欧美日本在线看| 国产精品久久久久久久久动漫| 国产欧美一区二区视频| 曰韩精品一区二区| 亚洲精品日韩一| 久久久国产精彩视频美女艺术照福利 | 亚洲国产精品一区在线观看不卡| 亚洲国产高清一区| 亚洲一区二区伦理| 久久久精品动漫| 欧美日本一区| 国产真实久久| 在线一区二区三区四区五区| 欧美一乱一性一交一视频| 免费人成网站在线观看欧美高清| 欧美二区在线观看| 亚洲乱码久久| 久久久久久亚洲精品杨幂换脸| 欧美激情自拍| 国语精品中文字幕| 这里只有精品电影| 久久亚洲一区二区三区四区| 亚洲精品免费网站| 久久国产黑丝| 国产精品爱久久久久久久| 在线观看亚洲视频啊啊啊啊| 亚洲一二三区在线观看| 美乳少妇欧美精品| 亚洲一本大道在线| 欧美成人精品一区| 国产午夜精品麻豆| 中文欧美在线视频| 欧美国产大片| 久久精品视频免费| 国产精品麻豆欧美日韩ww | 国产精品网曝门| 亚洲精品国产视频| 玖玖精品视频| 香蕉久久夜色精品国产| 欧美日韩国产小视频在线观看| 极品少妇一区二区| 久久国产高清| 亚洲一区二区三区在线| 欧美精品久久99| 亚洲黑丝一区二区| 美女国产一区| 久久精品免费电影| 国产精品尤物| 午夜精品国产更新| 一区二区日本视频| 欧美精品一区二区精品网| 亚洲国产精品黑人久久久 | 一区二区免费在线播放| 欧美日本在线| 亚洲深爱激情| 久久免费国产精品| 国产精品久久久久久妇女6080| 一区二区动漫| av成人福利| 国产精品扒开腿爽爽爽视频| 亚洲一区在线免费观看| 国产精品99久久久久久人| 欧美天天影院| 亚洲综合欧美| 亚洲欧美日韩在线观看a三区| 国产农村妇女精品一区二区| 午夜精品久久久久久99热|