題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。
解決與鍊錶相關的問題總是有大量的指標操作,而指標操作的**總是容易出錯的。很多的面試官喜歡出鍊錶相關的問題,就是想通過指標操作來考察應聘者的編碼功底。為了避免出錯,我們最好先進行全面的分析。在實際軟體開發周期中,設計的時間通常不會比編碼的時間短。在面試的時候我們不要急於動手寫**,而是一開始仔細分析和涉及,這將會給面試官留下好的印象。與其給出一段漏洞百出的**,倒不如仔細分析再寫出魯棒性好的**。
為了正確的反轉乙個鍊錶,需要調整鍊錶中指標的方向。為了將調整指標這個複雜的過程分析清楚,我們可以借助圖形來直觀的分析。在圖中所示的鍊錶中,h,i,j是3個相鄰的結點。假設經過若干的操作,我們已經把結點h之前的指標調整完畢,這些結點的m_pnext都指向前面的乙個結點。接下來我們把i的m_pnext指向h,此時的鍊錶結構如圖b所示。
由於結點i的m_pnext指向了它的前乙個結點,導致我們無法在鍊錶中遍歷到結點j。為了避免鍊錶在結點i處斷開,我們需要在調整結點i的m_pnext之前,把結點j儲存下來。
也就是說我們在調整結點i的m_pnext指標時,除了需要知道結點i本身之外,還需要i的前乙個結點h,因為我們需要把結點i的m_pnext指向結點h,同時,我們還實現需要儲存i個結點j,以防止鍊錶斷開。因此相應地我們需要三個指標,分別指向當前遍歷到的結點,它的前乙個結點和後乙個結點。
最後我們試著找到反轉鍊錶的頭結點。不難分析出反轉後的鍊錶的頭結點是原始鍊錶的尾節點。什麼結點是尾節點,自然是m_pnext為 null 的結點。
package鍊錶1.2.3.4,輸出反轉後的頭結點:4offer_16;
public
class
reverselist
return
prelistnode; //返回的是剛反轉結束的i
} public
static
void
main(string args)
}
class
listnode
參考:
面試題16 反轉鍊錶
題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...
面試題16 反轉鍊錶
題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。思路 設定三個指標p q temp,p用來指向當前結點,q用來指向當前結點的前乙個結點,temp指向當前結點的下乙個結點,遍歷鍊錶的結點時,先儲存當前結點p的下乙個結點到temp,然後讓當前結點的next指向前乙個結點p,...
面試題16 反轉鍊錶
題目 反轉鍊錶。輸入鍊錶的頭結點,反轉輸出反轉後鍊錶的頭結點。這種鍊錶操作的題之前做過,還專門寫過鍊錶反轉的東東。咋一看,覺得這用遞迴不so easy嗎。結果,papa打臉了,寫了半個多小時才出來,面試肯定就掛了。都要哭了,寫一萬遍都不會啊。先用遞迴實現 struct listnode class ...