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

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

}
  回復  更多評論
  
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(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>
            亚洲欧美成人| 欧美在线视频全部完| 国产性猛交xxxx免费看久久| 欧美在线视频免费播放| 性伦欧美刺激片在线观看| 久久这里只有精品视频首页| 欧美极品影院| 国产女精品视频网站免费| 在线免费精品视频| 99视频日韩| 老司机久久99久久精品播放免费 | 国产精品chinese| 国产欧美综合一区二区三区| 久久精品一二三区| 日韩视频国产视频| 久久国产日韩欧美| 欧美视频中文一区二区三区在线观看| 国产真实久久| 亚洲欧美久久| 亚洲国产日韩精品| 亚洲一区二区在线播放| 欧美成人一区在线| 性欧美大战久久久久久久免费观看 | 这里只有精品电影| 老牛嫩草一区二区三区日本 | 国产精品一区毛片| 日韩午夜激情av| 免费中文日韩| 欧美主播一区二区三区| 亚洲人成网站在线播| 久久精品卡一| 先锋影音久久| 夜夜嗨网站十八久久| 欧美亚洲一区| 黄色综合网站| 久久综合电影一区| 久久精视频免费在线久久完整在线看| 国产精品久久久久久久久搜平片| aa级大片欧美| 麻豆成人在线播放| 尤物九九久久国产精品的分类| 久久久久88色偷偷免费| 欧美日韩精品免费观看视频| 99视频在线精品国自产拍免费观看| 亚洲欧美日韩精品久久久久| 国产精品日韩欧美一区| 欧美在线一二三四区| 欧美另类在线观看| 亚洲伊人久久综合| 欧美精品成人在线| 欧美成人dvd在线视频| 国产一区91精品张津瑜| 久久综合色一综合色88| 国产精品国产三级国产普通话蜜臀 | 国产人妖伪娘一区91| 正在播放欧美视频| 一区二区高清在线观看| 亚洲精品一区二区三区蜜桃久| 欧美日韩一区综合| 久久狠狠久久综合桃花| 国产精品久久久久久久久久久久久| 91久久精品视频| 国产精品高潮久久| 一本色道久久加勒比精品| 国产欧美一区二区视频| 亚洲制服av| 午夜日韩福利| 久久久久久久综合狠狠综合| 亚洲精品国产精品国自产观看浪潮 | 久久亚洲春色中文字幕| 国产一区二区精品在线观看| 亚洲欧美卡通另类91av| 欧美在线视频观看| 国产一区二区三区高清| 欧美一区二区三区精品电影| 久久精品在线视频| 在线精品在线| 欧美国产日韩在线| 欧美专区在线观看一区| 国产在线拍揄自揄视频不卡99 | 亚洲国产成人在线视频| 欧美天天视频| 亚洲欧美日韩国产另类专区| 久久精彩视频| 亚洲成色777777女色窝| 欧美精品久久久久久久| 中日韩在线视频| 久久久精品国产免费观看同学 | 国产精品久久国产精麻豆99网站| 亚洲一区二区不卡免费| 日韩网站在线观看| 国产精品激情av在线播放| 亚洲欧美另类在线| 免费精品视频| 国产一区二区黄| 久久青青草综合| 欧美一区二区成人6969| 欧美日韩ab片| 欧美亚洲色图校园春色| 欧美激情一区二区三区在线 | 麻豆成人精品| 亚洲视频在线观看| 一区二区三区久久| 国产综合欧美| 欧美日韩成人综合天天影院| 午夜精品久久99蜜桃的功能介绍| 欧美成人国产| 久久激情视频久久| 日韩一级不卡| 在线电影欧美日韩一区二区私密| 欧美日韩国产区| 久久精品国产欧美亚洲人人爽| 亚洲精品男同| 中国成人在线视频| 欧美日本免费| 玖玖国产精品视频| 亚洲自拍偷拍麻豆| 亚洲精品在线看| 免费成人毛片| 久久精品最新地址| 亚洲一区二区欧美| 国产精品久99| 欧美人与禽猛交乱配| 久久久久久久999| 亚洲欧美精品伊人久久| 99国产精品久久久久久久久久| 在线综合视频| 亚洲欧洲精品天堂一级| 国产综合自拍| 国产日本欧美视频| 国产精品久久久久久影院8一贰佰| 乱人伦精品视频在线观看| 性久久久久久久久久久久| 国产精品99久久久久久人| 亚洲日韩第九十九页| 欧美1区视频| 欧美.日韩.国产.一区.二区| 久久久91精品国产一区二区三区 | 久久免费精品视频| 亚洲国产成人久久综合| 欧美激情在线播放| 老司机久久99久久精品播放免费 | 欧美在线网址| 欧美一区二区三区免费视频| 亚洲免费影院| 西西人体一区二区| 欧美一级成年大片在线观看| 先锋a资源在线看亚洲| 欧美亚洲视频| 久久蜜臀精品av| 蜜臀a∨国产成人精品| 麻豆av一区二区三区| 欧美成年人视频| 亚洲免费小视频| 亚洲欧美视频| 久久成年人视频| 快she精品国产999| 欧美精品久久99| 欧美日韩视频在线一区二区观看视频| 欧美巨乳在线观看| 欧美性猛交一区二区三区精品| 国产精品久久久久久影视| 国产日韩在线看| 亚洲高清一区二| 在线亚洲高清视频| 久久超碰97中文字幕| 免费在线观看日韩欧美| 亚洲电影自拍| 亚洲午夜电影网| 久久精品国产精品亚洲| 男女精品视频| 久久久夜色精品亚洲| 欧美福利精品| 国产精品男gay被猛男狂揉视频| 国产亚洲一级高清| 亚洲日本aⅴ片在线观看香蕉| 亚洲一区3d动漫同人无遮挡| 久久国产精品久久久久久| 欧美大色视频| 中文国产成人精品| 六月天综合网| 国产精品拍天天在线| 亚洲国产欧美一区二区三区同亚洲| 国产日韩av一区二区| 亚洲激情视频在线| 香蕉免费一区二区三区在线观看 | 中文av一区二区| 久久久成人网| 一本色道久久88综合日韩精品| 欧美专区第一页| 国产精品福利av| 亚洲日本理论电影| 久久激情五月丁香伊人| 亚洲精品视频在线播放| 久久精品视频99| 国产精品一页| 亚洲深夜福利| 亚洲激情网站免费观看| 久久米奇亚洲| 韩国三级电影久久久久久|