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

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 閱讀(1917) 評論(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;

}
  回復  更多評論
  
<2011年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(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>
            亚洲一区二区三区免费视频| 亚洲精品国久久99热| 欧美激情视频在线播放 | 欧美一区二区三区成人| 欧美一区二区视频97| 亚洲自拍偷拍麻豆| 国产精品视频一区二区三区 | 亚洲国产天堂网精品网站| 欧美日韩一区二区在线| 国产精品一区久久| 午夜宅男欧美| 欧美成熟视频| 亚洲视屏一区| 亚洲欧美另类中文字幕| 亚洲精品日韩在线| 亚洲精品欧洲| 欧美在线电影| 午夜精品成人在线视频| 国产日韩一区二区三区| 久久久久久9999| 蜜桃久久精品乱码一区二区| 欧美在线一级视频| 欧美激情乱人伦| 日韩一级成人av| 久久婷婷av| 亚洲国产成人久久综合| 久久久免费精品| 亚洲视频导航| 欧美丰满高潮xxxx喷水动漫| 亚洲国产精品久久久久婷婷884| 裸体女人亚洲精品一区| 99re视频这里只有精品| 日韩视频在线免费| 久久精品日韩| 亚洲一区二区三区视频| 欧美国产第二页| 亚洲黄网站在线观看| 一本久久青青| 亚洲精品永久免费| 亚洲视频欧美在线| 欧美在线free| 一本色道久久综合狠狠躁篇的优点 | 欧美另类99xxxxx| 午夜精彩视频在线观看不卡| 国产欧美日韩综合| 亚洲人成7777| 久久手机免费观看| 9l视频自拍蝌蚪9l视频成人| 久久久久国内| 国产乱码精品一区二区三区av| 91久久精品网| 可以看av的网站久久看| 亚洲欧美日本日韩| 国产精品播放| 一区二区久久久久久| 欧美激情第一页xxx| 久久se精品一区精品二区| 国产精品一区二区三区久久久 | 亚洲精品自在久久| 欧美.www| 亚洲高清资源| 欧美福利在线| 噜噜噜噜噜久久久久久91 | 亚洲精品乱码久久久久久蜜桃91| 久久久精品五月天| 国产亚洲一区在线播放| 久久国内精品视频| 欧美一区二区三区四区高清| 国产日韩欧美夫妻视频在线观看| 羞羞色国产精品| 亚洲欧美另类国产| 国产亚洲精品美女| 久久一二三四| 免费观看成人| 一级日韩一区在线观看| 亚洲激情网址| 亚洲电影免费在线观看| 欧美精品在线观看| 亚洲一二三区在线观看| 亚洲午夜电影| 国产在线日韩| 欧美激情精品久久久久久黑人 | 亚洲高清视频在线| 欧美国产1区2区| aaa亚洲精品一二三区| 日韩亚洲欧美中文三级| 国产精品五区| 另类成人小视频在线| 欧美成年人视频| 一区二区免费在线播放| 亚洲一区二区三区三| 激情综合中文娱乐网| 91久久精品日日躁夜夜躁国产| 欧美日韩成人综合天天影院| 久久国产精品久久久久久久久久 | 日韩一区二区精品在线观看| 国产麻豆成人精品| 欧美成人一区在线| 国产麻豆午夜三级精品| 欧美 日韩 国产在线 | 影音先锋在线一区| 亚洲美女中出| 在线日韩中文字幕| 一区二区三区视频在线观看| 伊人春色精品| 亚洲视频一区在线观看| 亚洲精品小视频| 欧美专区一区二区三区| 一本综合久久| 麻豆精品国产91久久久久久| 亚洲综合色自拍一区| 毛片精品免费在线观看| 西西人体一区二区| 欧美日韩国产色综合一二三四| 久久一区亚洲| 国产欧美一区二区精品婷婷| 日韩视频在线观看一区二区| 亚洲高清视频的网址| 香蕉国产精品偷在线观看不卡| 亚洲精品一区二区三区av| 久久精品99国产精品酒店日本| 亚洲午夜在线观看视频在线| 狼人社综合社区| 久久亚洲综合色| 国产麻豆精品theporn| 99热在这里有精品免费| 日韩视频亚洲视频| 你懂的网址国产 欧美| 久久久视频精品| 久久嫩草精品久久久精品| 亚洲男女自偷自拍| 亚洲国产精品一区制服丝袜 | 香蕉久久国产| 欧美成人精品影院| 欧美成人精品福利| 国产一区二区三区四区hd| 一本色道久久综合亚洲91| 欧美日韩一区二区三区四区五区 | 另类综合日韩欧美亚洲| 亚洲视频一二区| 欧美二区在线| 久久免费一区| 午夜欧美大尺度福利影院在线看| 加勒比av一区二区| 欧美视频中文字幕在线| 久久躁狠狠躁夜夜爽| 亚洲一区二区三区四区视频| 欧美国产日韩精品| 久久不见久久见免费视频1| 亚洲卡通欧美制服中文| 国产一区二区在线免费观看| 欧美日韩国产一级| 老鸭窝亚洲一区二区三区| 亚洲一区精彩视频| 亚洲三级电影全部在线观看高清| 久久精品一区蜜桃臀影院| 亚洲先锋成人| 日韩小视频在线观看| 合欧美一区二区三区| 国产精品毛片大码女人| 欧美精品系列| 欧美成人a视频| 另类欧美日韩国产在线| 欧美资源在线观看| 午夜欧美精品久久久久久久| 一区二区三区日韩| 99亚洲视频| 日韩视频在线播放| 亚洲精品久久久蜜桃| 亚洲黄色av一区| 亚洲成色777777在线观看影院| 久久夜色精品国产欧美乱极品| 欧美在线免费观看| 午夜在线精品| 欧美在线在线| 久久精品国产精品亚洲| 性欧美超级视频| 欧美在线观看一区| 久久gogo国模啪啪人体图| 欧美在线视频一区二区三区| 欧美在线播放一区| 久久久精品国产一区二区三区| 久久国内精品视频| 久久综合久久久久88| 久久亚洲私人国产精品va| 久久亚洲国产成人| 美女脱光内衣内裤视频久久网站| 老司机成人网| 亚洲高清视频一区| 亚洲毛片在线| 亚洲一区免费| 久久国产精品网站| 老色批av在线精品| 欧美精品videossex性护士| 欧美日本免费| 国产精品视频第一区| 国产亚洲精品aa| 91久久国产综合久久蜜月精品| 日韩亚洲精品视频| 亚洲欧美日韩天堂一区二区|