亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

09考研數(shù)據(jù)結(jié)構(gòu)試題的一種解法(Java版)

系統(tǒng) 2026 0

本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

雖然研究生已畢業(yè),但看到有一些難度的研究生考試題還是忍不住要做做,本文給出了09年研究生入學(xué)考試的一道數(shù)據(jù)結(jié)構(gòu)題的Java實(shí)現(xiàn)。該題的描述如下圖所示。

09考研數(shù)據(jù)結(jié)構(gòu)試題的一種解法(Java版)

該題的兩種實(shí)現(xiàn)一位朋友已經(jīng)完成了,詳見(jiàn) 遞歸和非遞歸實(shí)現(xiàn) 。在本文將給出另外一種算法,該算法的空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O(n)。這在空間復(fù)雜度和時(shí)間復(fù)雜度上應(yīng)該是比較優(yōu)化了。
本算法的基本思想如下:
既然是查找倒數(shù)第K個(gè)結(jié)點(diǎn)(注意,不是正數(shù),否則就沒(méi)什么可討論的了),而且鏈表是單向的,還不能改變表結(jié)構(gòu),這就意味著只能從前往后掃描結(jié)點(diǎn)。我們首先 要知道這個(gè)鏈表有多少個(gè)結(jié)點(diǎn)(如果總結(jié)點(diǎn)數(shù)都不知道,何談倒數(shù)?),這個(gè)非常簡(jiǎn)單,只要從頭掃描一下鏈表,再計(jì)一下數(shù)即可。
在同一時(shí)間從事多項(xiàng)工作會(huì)大大提升效率,當(dāng)然,掃描鏈表也不例外,在掃描鏈表的同時(shí),還需要做一些其他的工作。既然只能從前向后掃描鏈表,而且要求倒數(shù)第 K個(gè)結(jié)點(diǎn),那就讓我們把這個(gè)鏈表按長(zhǎng)度為K分成若干塊,而最后掃描的結(jié)果要么結(jié)點(diǎn)數(shù)是K的整數(shù)倍(模為0),要么余數(shù)(模)不為0(多出幾個(gè)結(jié)點(diǎn),多出的 結(jié)點(diǎn)數(shù)小于K)。
先看看第二種情況。
假設(shè)有12個(gè)結(jié)點(diǎn)的鏈表,每一個(gè)結(jié)點(diǎn)的值從前往后分別是1至12,如下所示:

1 2 3 4 5 6 7 8 9 10 11 12

假設(shè)我們要求倒數(shù)第5個(gè)結(jié)點(diǎn),我們直接就可以看出結(jié)果是8。那么用程序如何處理呢?

先按長(zhǎng)度為5將上面的結(jié)點(diǎn)分成三個(gè)區(qū)域,如下:

1 2 3 4 5 6 7 8 9 10 11 12

注意,不是物理分,而是使用變量來(lái)保存區(qū)域的邊界(也就是區(qū)域最后一個(gè)結(jié)點(diǎn)的對(duì)象)。
從上面的分隔可以看出,最后剩下兩個(gè)結(jié)點(diǎn),既然是求倒數(shù)第5個(gè),而最后剩下了兩個(gè),那么還缺5-2=3個(gè),因此,只需要從倒數(shù)第二個(gè)塊(6 7 8 9 10)略過(guò)前兩個(gè),第三個(gè)結(jié)點(diǎn)(8)就是我們要求的結(jié)果,而5就是題中的k,2就是結(jié)點(diǎn)數(shù)與k的模,因此,可以推出一個(gè)公式,倒數(shù)第k個(gè)結(jié)點(diǎn)就是按長(zhǎng)度為 k按分成的若干塊中的第二塊的第(結(jié)點(diǎn)數(shù) % k+ 1)個(gè)結(jié)點(diǎn)。
下面來(lái)看看(結(jié)點(diǎn)數(shù) % k)為0的情況。假設(shè)上面的例子中的k為4,正確的輸出結(jié)果應(yīng)為9,分塊如下:

1 2 3 4 5 6 7 8 9 10 11 12

從上面的三個(gè)塊可以看出,結(jié)果正好是最后一個(gè)塊的第一個(gè)結(jié)點(diǎn),這時(shí)mod為0(mod=結(jié)點(diǎn)數(shù) % k),因此,在這種情況也可以使用上面的公式,只是變成了最后一個(gè)塊。

根據(jù)上面的基本思想可以設(shè)兩個(gè)指針,p1和p2,其中p1最終指向倒數(shù)第2個(gè)完整塊,p2最終指向倒數(shù)第1個(gè)完整塊,對(duì)于第一種情況,p1指向5,p2指 向10,這時(shí)可以使p1向后移動(dòng)(k - mod)個(gè)結(jié)點(diǎn)即可(從5移動(dòng)3個(gè)正好是8)。而對(duì)于第二種情況,p1指向8,p2指向12,而mod=0,這時(shí)的結(jié)果仍然是mod+1,也就是p1向后 移動(dòng)1個(gè)結(jié)點(diǎn)就是所求的結(jié)果。 為了滿足(k=結(jié)點(diǎn)數(shù))的情況,需要將p1的初始值設(shè)為頭結(jié)點(diǎn),這樣如果(k=結(jié)點(diǎn)數(shù)),就直接從頭結(jié)點(diǎn)向后移動(dòng)一個(gè)結(jié)點(diǎn)就是最后的結(jié)果,如上面的例子求 倒數(shù)第12個(gè)結(jié)點(diǎn),也就是求正數(shù)第1個(gè)結(jié)點(diǎn)。

下面是這個(gè)算法的具體實(shí)現(xiàn)(包括核心算法、生成鏈表及調(diào)用核心算法的代碼):

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public class Test
{

static class Node
{
public int data;
public NodenextNode;
}
//////////////////////////////////////////
// 核心算法
private static int findNode(NodeheadNode, int k)
{
Nodep
= headNode,p1 = headNode,p2 = null ;
int count = 0 ; // 表示結(jié)點(diǎn)數(shù)
while (p.nextNode != null )
{
p
= p.nextNode;
count
++ ;
// 遇到k的整數(shù)位個(gè)結(jié)點(diǎn),進(jìn)行分塊
if (count % k == 0 )
{
if (p2 != null )
p1
= p2;
p2
= p;
}
}
// k超過(guò)鏈表結(jié)點(diǎn)數(shù),未找到,返回0
// 此處也可以用k > count來(lái)判斷
if (p2 == null )
{
return 0 ;
}
else
{
int mod = count % k;
int offset = mod + 1 ; // 任何情況下,最終結(jié)果都是p1指向的結(jié)點(diǎn)向后移動(dòng)(mod+1)個(gè)結(jié)點(diǎn)
for ( int i = 0 ;i < offset;i ++ )
p1
= p1.nextNode;
System.out.println(p1.data);
return 1 ;
}
}
////////////////////////////////////////
public static void main(String[]args) throws Exception
{
// 產(chǎn)生一個(gè)包含1個(gè)頭結(jié)點(diǎn)和120個(gè)結(jié)點(diǎn)的鏈表
NodeheadNode = new Node();
Nodep
= headNode;
for ( int i = 0 ;i < 120 ;i ++ )
{
p.nextNode
= new Node();
p.nextNode.data
= i + 1 ;
p
= p.nextNode;
}
p.nextNode
= null ;
// 開(kāi)始查找倒數(shù)第k個(gè)結(jié)點(diǎn),如果找到,返回1,并輸出結(jié)點(diǎn)的data值
System.out.println(findNode(headNode, 12 ));
}
}


上面程序的輸出結(jié)果如下:

109
1

讀者也可以使用其他的測(cè)試用例來(lái)測(cè)試上面的程序。

本算法從空間復(fù)雜度O(1)和時(shí)間復(fù)雜度O(n)的綜合指標(biāo)基本上算是比較優(yōu)化了,如果哪位讀者還有更簡(jiǎn)單和快速的算法,請(qǐng)跟貼!!

09考研數(shù)據(jù)結(jié)構(gòu)試題的一種解法(Java版)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩经典欧美一区二区三区 | 午夜精品久久久久久久第一页 | 天天怕夜夜怕狠狠怕 | 九九色视频在线观看 | 国产精品成人在线 | 手机看片日韩日韩国产在线看 | 久久国产午夜精品理论片34页 | 天天操天天玩 | 中国女人精69xxxxxx视频 | 精品综合久久久久久98 | 夜夜精品视频 | 欧美肥老太婆交 | 狠狠88综合久久久久综合网 | 久久99精品久久久久久野外 | 国产精品自拍视频 | 四虎永久地址 | 国产欧美一区视频在线观看 | 国产亚洲精品97在线观看 | 亚洲欧美人成综合在线最新 | 奇米影视777第四色 奇米影视777狠狠狠888不卡 | 亚洲欧洲国产精品 | 亚洲日韩精品欧美一区二区 | 私房色播 | 久久国产香蕉 | 成人永久免费视频网站在线观看 | 视频二区精品中文字幕 | 91热爆国产露脸 | 麻豆视频一区二区 | 久久中文视频 | 香蕉网站在线观看 | 欧美日韩无线码在线观看 | 国产成人一区二区三区影院免费 | 欧美777精品久久久久网 | 久久爱成人网 | 国产亚洲精品九九久在线观看 | 国产夫妻久久线观看 | 真实国产精品视频国产网 | 国产成人综合自拍 | 成人a免费α片在线视频网站 | 欧美性插视频 | 国产精品999 |