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

posts - 297,  comments - 15,  trackbacks - 0

題目:給你一個(gè)單向鏈表的頭指針,可能最后不是NULL終止,而是循環(huá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的步長是1,B的步長是2,那么當(dāng)他們?cè)诃h(huán)內(nèi)相遇時(shí),設(shè)a是鏈表頭到環(huán)節(jié)點(diǎn)的位置,b是環(huán)的周長,c是A和B在環(huán)上首次相遇時(shí)與環(huán)節(jié)點(diǎn)的距離,m和n分別是第一次相遇時(shí)A和B走過的環(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以步長1前進(jìn),需要路程b-c+x*b=(x+1)b-c,由1可知,a=kb-c,那么也就是說:指針A要到達(dá)環(huán)節(jié)點(diǎn)還需要走的路程kb-c正好等于a。這樣問題就解決了:A從首次相遇的位置步長為1走到環(huán)節(jié)點(diǎn)需要kb-c,那么B只需從頭節(jié)點(diǎn)步長為一走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
還有一種算法,就是用有向圖來實(shí)現(xiàn)(具體見下面代碼):
把鏈表看成一個(gè)有向圖,深度優(yōu)先遍歷該有向圖,判斷有無循環(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)論
  
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(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

搜索

  •  

最新評(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>
            欧美激情国产精品| 亚洲日本中文| 亚洲综合精品四区| 久久午夜精品一区二区| 黑人一区二区三区四区五区| 老牛国产精品一区的观看方式| 欧美国产精品久久| 亚洲高清视频一区二区| 欧美成人国产| 亚洲综合国产激情另类一区| 亚洲一区二区三区高清不卡| 欧美在线视频导航| 久久婷婷影院| 日韩写真在线| 欧美一区二区三区啪啪| 一区二区三区波多野结衣在线观看| 亚洲日本va在线观看| 欧美成人一区二区三区在线观看| 欧美激情视频一区二区三区免费 | 国产精品mm| 狼人社综合社区| 一区二区三区 在线观看视| 亚洲欧美日韩在线不卡| 欧美成人免费一级人片100| 欧美日韩成人网| 国产亚洲综合精品| 国产午夜精品一区理论片飘花 | 久久精品国产亚洲精品| 亚洲欧美国产精品va在线观看 | 久久久欧美一区二区| 久久在线视频在线| 中文亚洲免费| 亚洲欧美一区二区三区极速播放 | 欧美在线网站| 亚洲午夜激情| 国产精品久久二区二区| 99精品视频一区| 欧美成人激情视频| 午夜激情综合网| 欧美激情在线有限公司| 亚洲永久字幕| 国产精品成人观看视频免费 | 日韩一级视频免费观看在线| 亚洲国产精品第一区二区三区| 亚洲图片你懂的| 亚洲久色影视| 国产精品免费看片| 欧美一区二区免费视频| 午夜视频在线观看一区| 久久精品亚洲| 国产综合自拍| 欧美在线不卡视频| 亚洲综合色丁香婷婷六月图片| 暖暖成人免费视频| 国产伦精品一区二区三区照片91| 最近看过的日韩成人| 亚洲欧美国产三级| 亚洲欧美国产精品专区久久| 久久色在线观看| 国产伦精品一区二区三区在线观看 | 亚洲电影视频在线| 一本色道久久综合亚洲精品小说| 欧美性一区二区| 欧美电影资源| 欧美体内谢she精2性欧美| 亚洲免费成人av电影| 亚洲五月婷婷| 国产欧美综合在线| 欧美影视一区| 欧美电影打屁股sp| 亚洲女性喷水在线观看一区| 国产欧美一区二区三区另类精品 | 国产精品入口夜色视频大尺度| 久久影音先锋| 国产精品欧美精品| 亚洲激情不卡| 国产视频久久久久| 妖精成人www高清在线观看| 国产亚洲欧美色| 欧美大香线蕉线伊人久久国产精品| 男女激情视频一区| 日韩午夜剧场| 亚洲一区二区视频在线观看| 亚洲六月丁香色婷婷综合久久| 蜜臀av一级做a爰片久久| 国产精品99久久久久久宅男| 亚洲欧美经典视频| 久久国产精品久久w女人spa| 毛片精品免费在线观看| 久久激情五月激情| 欧美日韩一区二区三区四区五区| 久久久高清一区二区三区| 国产精品午夜国产小视频| 久久一区免费| 亚洲美女中出| 好看的亚洲午夜视频在线| 欧美激情亚洲视频| 日韩午夜黄色| 亚洲欧美日韩一区二区在线 | 亚洲已满18点击进入久久| 香蕉久久夜色精品| 男人的天堂亚洲在线| 午夜一区不卡| 亚洲福利国产精品| 乱码第一页成人| 亚洲一区二区三区高清不卡| 亚洲男人天堂2024| 国产精品草莓在线免费观看| 日韩视频一区二区| 夜夜嗨一区二区| 国产精品久久久久久一区二区三区 | 亚洲视频第一页| 欧美日韩国内| 亚洲图色在线| 欧美一区二区日韩一区二区| 亚洲激情影院| 久久免费精品日本久久中文字幕| 亚洲国产天堂久久综合| 欧美性猛交xxxx乱大交蜜桃| 亚洲一区二区三区三| 欧美一区二区三区四区高清| 激情一区二区三区| 亚洲一区3d动漫同人无遮挡| 亚洲区免费影片| 欧美成人精品激情在线观看| 欧美一区二区三区四区在线观看地址| 国产精品白丝jk黑袜喷水| 另类专区欧美制服同性| 亚洲一区二区精品| 欧美国产综合视频| 久久一区二区三区超碰国产精品| 亚洲综合大片69999| 激情另类综合| 国产婷婷成人久久av免费高清| 亚洲欧美日韩国产另类专区| 国产日韩av在线播放| 欧美区高清在线| 欧美精品自拍| 欧美丰满高潮xxxx喷水动漫| 一本久久精品一区二区| 欧美承认网站| 亚洲精品中文字幕女同| 欧美激情视频免费观看| 亚洲欧洲在线视频| 亚洲一级片在线观看| 妖精视频成人观看www| 亚洲黄网站在线观看| 亚洲国产日韩在线一区模特| 久久久视频精品| 国产亚洲欧美日韩日本| 久久精品国产v日韩v亚洲| 亚洲精品一二区| 久久成人免费网| 国产精品免费观看在线| 在线免费精品视频| 一本色道久久综合亚洲精品不| 午夜久久tv| 美女免费视频一区| 亚洲片在线观看| 国产精品一区久久| 欧美自拍丝袜亚洲| 国产欧美日韩精品a在线观看| 夜夜嗨av一区二区三区中文字幕| 国产精品扒开腿爽爽爽视频| 亚洲国产视频直播| 亚洲福利视频网| 欧美成人中文字幕| 亚洲黄色影片| 这里只有精品丝袜| 国产精品视频yy9299一区| 欧美一区二区三区喷汁尤物| 免费成人高清在线视频| 日韩图片一区| 国产欧美一区二区三区久久| 久久夜色精品| 99精品欧美一区| 久久天天躁夜夜躁狠狠躁2022| 亚洲欧洲综合| 国产欧美va欧美va香蕉在| 免费观看欧美在线视频的网站| 一区二区冒白浆视频| 艳妇臀荡乳欲伦亚洲一区| 久久亚洲国产精品一区二区| 国产女人aaa级久久久级| 久久久青草婷婷精品综合日韩| 最新国产成人av网站网址麻豆| 性欧美大战久久久久久久免费观看| 在线日本欧美| 国产伦精品一区二区三区视频孕妇 | 欧美一区二区三区在线看| 在线播放日韩欧美| 国产精品久久久久久久电影| 老司机午夜精品| 羞羞色国产精品| 一区二区三区回区在观看免费视频 | 国产日韩亚洲欧美综合| 欧美日韩国产一区二区| 美女任你摸久久| 欧美一区二区三区视频免费| 一区二区欧美日韩|