首頁(yè)
題庫(kù)
網(wǎng)課
在線???/a>
桌面端
登錄
搜標(biāo)題
搜題干
搜選項(xiàng)
0
/ 200字
搜索
單項(xiàng)選擇題
— Wht color is it — It’s _______ ornge. It’s _______ ornge pen.,nB.n,nC./,nD.n,— Wht color is it — It’s _______ ornge. It’s _______ ornge pen.,n B.n,n C./,n D.n,
A.an
B.an, an
C./, an
D.an, a
點(diǎn)擊查看答案&解析
手機(jī)看題
你可能感興趣的試題
問(wèn)答題
實(shí)現(xiàn)鏈表排序的函數(shù)中swap()函數(shù)
答案:
void ProductList::Swap(ProductList* ptr1, ProductList* ptr2)
{
Product *tmp;
tmp = ptr1->m_product;
ptr1->m_product = ptr2->m_product;
ptr2->m_product = tmp;
}
點(diǎn)擊查看答案&解析
手機(jī)看題
問(wèn)答題
面試題:反轉(zhuǎn)鏈表題目:定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭結(jié)點(diǎn),反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)。面試題:反轉(zhuǎn)鏈表 題目:定義一個(gè)函數(shù),輸入一個(gè)鏈表的頭結(jié)點(diǎn),反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)。鏈表結(jié)點(diǎn)定義如下: struct List Node { int m_n Key ListNode+ m_p Next };
答案:
解決與鏈表相關(guān)的問(wèn)題總是有大量的指針操作,而指針操作的代碼總是容易出錯(cuò)的。很多面試官喜歡出鏈表相關(guān)的問(wèn)題,就是想通過(guò)指針操作來(lái)考查應(yīng)聘者的編碼功底。為了避免出錯(cuò),我們最好先進(jìn)行全面的分析。在實(shí)際軟件開(kāi)發(fā)周期中,設(shè)計(jì)的時(shí)間通常不會(huì)比編碼的時(shí)間短。在面試的時(shí)候我們不要急于動(dòng)手寫(xiě)代碼,而是一開(kāi)始仔細(xì)分析和設(shè)計(jì),這將會(huì)給面 試官留下很好的印象。與其很快寫(xiě)出一段漏洞百出的代碼,倒不如仔細(xì)分析再寫(xiě)出魯棒的代碼。 為了正確地反轉(zhuǎn)一個(gè)鏈表,需要調(diào)整鏈表中指針的方向。為了將調(diào)整指針這個(gè)復(fù)雜的過(guò)程分析清楚,我們可以借助圖形來(lái)直觀地分析。在圖3.6(a)所示的鏈表中,h、i和j是3個(gè)相鄰的結(jié)點(diǎn)。假設(shè)經(jīng)過(guò)若干操作,我們已經(jīng)把結(jié)點(diǎn)h之前的指針調(diào)整完畢,這些結(jié)點(diǎn)的m_pNext都指向前面一個(gè)結(jié)點(diǎn)。接下來(lái)我們把i的m_pNext指向h,此時(shí)的鏈表結(jié)構(gòu)如圖3.6(b) 所示。 圖3.6反轉(zhuǎn)鏈表中結(jié)點(diǎn)的m_pNext指針導(dǎo)致鏈表出現(xiàn)斷裂 注:(a) 一個(gè)鏈表。(b)把i之前所有的結(jié)點(diǎn)的m_pNext都指向前一個(gè)結(jié)點(diǎn),導(dǎo)致鏈表在結(jié)點(diǎn)i、j之間斷裂。 不難注意到,由于結(jié)點(diǎn)i的m_pNext指向了它的前一個(gè)結(jié)點(diǎn),導(dǎo)致我們無(wú)法在鏈表中遍歷到結(jié)點(diǎn)j。為了避免鏈表在結(jié)點(diǎn)i處斷開(kāi),我們需要在調(diào)整結(jié)點(diǎn)i的m_pNext之前,把結(jié)點(diǎn)j保存下來(lái)。 也就是說(shuō)我們?cè)谡{(diào)整結(jié)點(diǎn)i的m_pNext指針時(shí),除了需要知道結(jié)點(diǎn)i本身之外,還需要i的前一個(gè)結(jié)點(diǎn)h,因?yàn)槲覀冃枰呀Y(jié)點(diǎn)i的m_p Next指向結(jié)點(diǎn)h。同時(shí),我們還事先需要保存i的一個(gè)結(jié)點(diǎn)j,以防止鏈表斷開(kāi)。因此相應(yīng)地我們需要定義3個(gè)指針,分別指向當(dāng)前遍歷到的結(jié)點(diǎn)、它的前一個(gè)結(jié)點(diǎn)及后一個(gè)結(jié)點(diǎn)。 最后我們?cè)囍业椒崔D(zhuǎn)后鏈表的頭結(jié)點(diǎn)。不難分析出反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)是原始鏈表的尾結(jié)點(diǎn)。什么結(jié)點(diǎn)是尾結(jié)點(diǎn)?自然是m_pNext為NULL的結(jié)點(diǎn)。 有了前面的分析,我們不難寫(xiě)出如下代碼: ListNode* Reverselist(ListNode*p Head) { ListNode+ pReversedHead=NULL; ListNode+- pNode=p Head; listNode*x pPrev=NULL while (pNode !=NULL) { ListNode*pNext=pNode->m_p Next; if (pNext==NULL) pReversedHead=p Node; pNode->m_ pNext - pprew; pPrev=pNode; pNode=pNext; } return pReversedHead; } ______________________________________________________ 在面試的過(guò)程中,我們發(fā)現(xiàn)應(yīng)聘者的代碼中經(jīng)常出現(xiàn)如下3種問(wèn)題: ● 輸入的鏈表頭指針為NULL或者整個(gè)鏈表只有一個(gè)結(jié)點(diǎn)時(shí),程序立即崩潰。 ● 反轉(zhuǎn)后的鏈表出現(xiàn)斷裂。 ● 返回的反轉(zhuǎn)之后的頭結(jié)點(diǎn)不是原始鏈表的尾結(jié)點(diǎn)。 在實(shí)際面試的時(shí)候,不同應(yīng)聘者的思路各不相同,因此寫(xiě)出的代碼也不一樣。那么應(yīng)聘者如何才能及時(shí)發(fā)現(xiàn)并糾正代碼中的問(wèn)題,以確保不犯上述錯(cuò)誤呢?一個(gè)很好的辦法就是提前想好測(cè)試用例。在寫(xiě)出代碼之后,立即用事先準(zhǔn)備好的測(cè)試用例檢查測(cè)試。如果面試是以手寫(xiě)代碼的方式,那也要在心里默默運(yùn)行代碼做單元測(cè)試。只有確保代碼通過(guò)測(cè)試之后,再提交面試官。我們要記住一點(diǎn):自己多花時(shí)間找出問(wèn)題并修正問(wèn)題,比在面試官找出問(wèn)題之后再去慌慌張張修改代碼要好得多。其實(shí)面試官檢查應(yīng)聘者代碼的方法也是用他事先準(zhǔn)備好的測(cè)試用例來(lái)測(cè)試。如果應(yīng)聘者能夠想到這些測(cè)試用例,并用它們來(lái)檢查測(cè)試自己的代碼,那就能保證有備無(wú)患、萬(wàn)無(wú)一失了。 以這道題為例,我們至少應(yīng)該想到幾類(lèi)測(cè)試用例對(duì)代碼做功能測(cè)試: ● 輸入的鏈表頭指針是NULL。 ● 輸入的鏈表只有一個(gè)結(jié)點(diǎn)。 ● 輸入的鏈表有多個(gè)結(jié)點(diǎn)。 如果我們確信代碼能夠通過(guò)這3類(lèi)測(cè)試用例的測(cè)試,那我們就有很大的把握能夠通過(guò)這輪面試了。 源代碼: 本題完整的源代碼詳見(jiàn)1 6_ ReverseList項(xiàng)目。 測(cè)試用例: ● 功能測(cè)試(輸入的鏈表含有多個(gè)結(jié)點(diǎn),鏈表中只有一個(gè)結(jié)點(diǎn))。 ● 特殊輸入測(cè)試(鏈表頭結(jié)點(diǎn)為NULL指針)。 本題考點(diǎn): ● 考查應(yīng)聘者對(duì)鏈表、指針的編程能力。 ● 特別注重考查應(yīng)聘者思維的全面性及寫(xiě)出來(lái)的代碼的魯棒性。 本題擴(kuò)展: 用遞歸實(shí)現(xiàn)同樣的反轉(zhuǎn)鏈表的功能。
點(diǎn)擊查看答案&解析
手機(jī)看題
微信掃碼免費(fèi)搜題